데이터 갱신시 일관성 문제가 없을 것이라 낙관적으로 생각
본인 외에도 다른 사람이 해당 데이터를 읽고/변경할 수 있습니다.
따라서 데이터를 수정하는 시점에 다른 사용자에 의해 데이터가 변경되었는지 변경 여부를 확인해야합니다.
@Entity
public class Entity {
...
@Version
private Integer version;
}
특정 필드에 @Version
annotation을 추가하여 optimistic lock을 사용할 수 있습니다.
필드의 data type으로는 아래의 7가지를 사용할 수 있습니다.
commit시 version정보가 변경되어 있으면 OptimisticLockException
이 발생합니다.
Entity에 @Version이 적용된 필드만 있으면 optimistic lock이 적용됩니다.
Entity 읽기시에도 버전을 체크하여 transaction이 종료될 때까지 데이터 변경이 없었음을 보장합니다.
이를 통해 dirty read
와 non-repeatable read
를 방지합니다.
optimistic lock을 사용하면서 버전 정보를 강제로 증가시킵니다.
데이터 갱신시 일관성 문제가 발생할 것이라 비관적으로 생각
lock을 걸어 본인 외에는 다른 사람이 데이터를 읽을 수 없게 하는 것입니다.
1. exclusive lock : 누군가 데이터를 읽고(사용)있다면, 다른 사람(transaction)은 해당 데이터에 접근할 수 없습니다.
2. shared lock : 다른 사람이 동시에 데이터를 읽을 수 있지만, 변경할 수는 없습니다.
Shared Lock을 얻고, 데이터를 읽을 순 있지만 업데이트/삭제를 방지합니다.
Exclusive Lock을 얻고, 데이터를 읽기/업데이트/삭제를 방지합니다.
1. PersistenceException : lock을 가져오는데 실패할 경우
2. LockTimeoutException : lock을 기다리다가 wait time을 지났을 경우