2016-09-13 4 views
6

나는 모든 것을 제거했다고 생각하지만 OL을 확실히 이해할만큼 확실하지는 않습니다. 일반적으로, 당신과 내가 팀에있어 최신 정보를 유지한다고 가정 해 봅시다. 나는 한 방에있어 시간을 절약하기로 결정했다. 나는 foo를 직접 업데이트 할 것이다. 그래서 업데이트를 시작합니다. 잠시 후 같은 생각을하고 편집 페이지에 로그온하여 업데이트 페이지를 업데이트하십시오. 먼저 끝내면 어떻게됩니까? 먼저 끝나면 어떻게됩니까? 누군가가 편집하고 누군가 읽는 것을 구별하는 방법에 실패한 구성에서. 내가 catch이고 다시로드하여 잠금을 업데이트하면 모든 변경 사항이 손실됩니다. 어떻게 해결됩니까? 여기에서 업데이트를 다시 실행하는 것은 간단하지만 잠재적으로 더 복잡한 폼 개체의 일부입니다.부실 개체 오류가 발생합니다. 낙관적 인 잠금 : 어떻게 작동합니까?

내 브라우저에서 한 장을로드하고 나중에 잊어 버린 다음 내 콘솔 (잠금 장치 : 0?)에서 내 콘솔에있는 파일 하나를 업데이트하지 못했습니다. 부실 객체 오류. 브라우저 일을 알아 챘다. 내 콘솔을 닫았습니다. 내 브라우저를 다시로드하려고 시도하고 부실 개체 오류가 발생했습니다. 여기에 실패한 것 코드는 다음과 같습니다

=> 7:  self.update_attributes({ 
    8:   failed_view_attempts: self.failed_view_attempts += 1, 
    9:   failed_view_at: Time.now 
    10:  }) 
    11:  end 
(byebug) self 
#<Product id: 12... lock_version: 0> 

#=> ActiveRecord::StaleObjectError (Attempted to update a stale object: Product.) 

것들 나는 시도했다 : 다른 인스턴스가 내가 after_initialize 콜백 puts "CALLED !!!!" 추가로드되는 경우

가 확인하려면,하지만 한 번만 인쇄.

그리고 오류를 구출 한 후 self.changed을 확인 0으로 lock_version 열 기본 설정 다시 ["updated_at", "failed_view_attempts", "failed_view_at"]

답변

1

필요를 얻을 수 (0).

0

낙관적 잠금은 개체 버전 번호를 기반으로합니다.

읽기 및 개체가 버전 번호에 전혀 영향을 미치지 않아야합니다.

일부 개체를 업데이트하려고하면이 버전 번호가 비교됩니다 (sql의 경우 실제로 업데이트 문은 "update ... where version = 1 and ..."). 업데이트시 증가합니다.

업데이트를 시도 할 때 비교가 실패하면 부실 개체 오류가 발생합니다. 즉, 변경 사항을 수행하는 동안 오브젝트가 다른 누군가에 의해 수정되었음을 의미합니다.

이 오류를 해결하려면 개체를 다시로드하여 실제 버전을 가져오고 변경 사항을 수동으로 병합해야합니다 (사용자에게 일부 정보를 표시하고 사용자가 예를 들어 결정하도록 허용).

+0

그러나 누군가 내가 편집하는 동안 동일한 행의 인스턴스를 호출하여 읽으면 버전 번호가 부딪 힐 수 있습니다. 로딩을 기반으로 한 것이지, 당신이하는 일이 아니라 올바른 것입니까? – MCB

+0

로드하지 않으면 버전 번호가 동일하게 유지됩니다. 그렇지 않으면 많은 업데이트가 있으므로 버전 번호가 업데이트에만 적용됩니다 (예 : 버전 업데이트 = 2, 버전 = 1). 일치하는 레코드가없는 경우 어디서 부실 객체 오류가 발생합니다. 페이지를 다시로드 할 때 문제는 캐쉬되고 DB에서 오브젝트를 다시로드하지 않는다는 것입니다. –

+0

예, 캐시 된 버전을 사용하는 브라우저는 이미 익숙한 것입니다. – MCB