2017-11-03 7 views
2

최대 절전 모드의 경우 LockModeType.OPTIMISTIC_FORCE_INCREMENT,이 잠금은 응용 프로그램 수준 또는 데이터베이스 수준에서 취해집니다.LockModeType.OPTIMISTIC_FORCE_INCREMENT는 응용 프로그램 수준 또는 데이터베이스 수준에서 취한 잠금입니다.

나는 낙관적 잠금을내어 다음 코드를 사용하고 있습니다 :

setting = this.entityManager.find(Setting.class, setting.getId(), 
LockModeType.OPTIMISTIC_FORCE_INCREMENT); 
setting.setUpdateTimestamp(new Date()); 
newSettingList.add(setting); 

이 두 JVM의 실행은 둘 다 같은 방법을 가지고 갈등이 존재한다고 가정 해 봅시다 것이다이 경우이 잠금 장치를 사용할 수 있습니까?

내 관찰은 내가 디버깅 할 때마다 "newSettingList.add (setting);" 코드에서이 줄에서 나는 그 시점에서 데이터베이스의 변경 사항을 보지 못했습니다. 그렇다면 데이터베이스 수준에서 잠금이 어떻게 보장됩니까?

+0

낙관적 인 잠금 전략을 사용할 때 동시에 편집하면 업데이트가 데이터베이스로 플러시 될 때 예외가 발생합니다. https://vladmihalcea.com/2015/02/09/hibernate-locking-patterns-how-does-optimistic_force_increment-lock-mode-work/ –

+0

두 개의 다른 JVM에서 업데이트가 수행되는 경우에도이 예외가 throw됩니다. 두 개의 다른 기계에? 어떻게 그들이 서로를 알게 될까요? – Vrishank

답변

1

낙관적 잠금은 레코드를 읽은 다음 버전 번호를 사용하여 레코드를 다시 작성하기 전에 버전이 변경되지 않았는지 확인하는 전략입니다. 레코드를 다시 작성할 때 버전에 대한 업데이트를 필터링하여 원자적임을 확인합니다.

비관적 잠금은 독점 사용을 위해 레코드를 잠그기 전까지 만 사용합니다. 낙관적 잠금보다 훨씬 향상된 무결성을 갖추고 있지만 교착 상태를 피하기 위해 애플리케이션 설계에주의해야합니다.

더 나은 설명 here.

이는 사용자가 + 관적 잠금을 사용하므로 데이터베이스 레벨의 잠금에 개입하지 않음을의 L합니다. 어떻게하면 데이터베이스를 사용하여 객체의 버전 관리를 유지할 수 있습니다. 예 :

a) 첫 번째 jvm에서 T1 트랜잭션을 열고 버전 v1로 개체를 읽습니다.

b) 두 번째 jvm에서 T2 트랜잭션을 열고 v1로 동일한 개체를 읽습니다 (이 개체의 업데이트가 수행되지 않음).

c) T1 트랜잭션에서 개체를 업데이트하고 버전 v2를 설정합니다. 당신은 거래를 커밋합니다.

d) 개체에 대해 db에서 다시 액세스하려고 시도하지만 버전 관리 때문에 예외가 발생합니다.
2 트랜잭션에 대해 동일한 jvm에서 액세스 할 필요가 없습니다.