나는 모든 것을 제거했다고 생각하지만 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"]
그러나 누군가 내가 편집하는 동안 동일한 행의 인스턴스를 호출하여 읽으면 버전 번호가 부딪 힐 수 있습니다. 로딩을 기반으로 한 것이지, 당신이하는 일이 아니라 올바른 것입니까? – MCB
로드하지 않으면 버전 번호가 동일하게 유지됩니다. 그렇지 않으면 많은 업데이트가 있으므로 버전 번호가 업데이트에만 적용됩니다 (예 : 버전 업데이트 = 2, 버전 = 1). 일치하는 레코드가없는 경우 어디서 부실 객체 오류가 발생합니다. 페이지를 다시로드 할 때 문제는 캐쉬되고 DB에서 오브젝트를 다시로드하지 않는다는 것입니다. –
예, 캐시 된 버전을 사용하는 브라우저는 이미 익숙한 것입니다. – MCB