본문 바로가기

Programming!

JPA Lock - @Version 사용하기

기본적으로 @Version사용시 낙관적 락이 적용된다.(LockModeType.NONE) 


A 사용자가 [OrderId 1번 조회후 ProductId를 10으로 변경] 

B 사용자가 [OrderId 1번 조회후 ProductId를 5으로 변경] 


먼저 A사용자가 ProductId의 변경을 시도하지만 이런저런 이슈로 하나의 TX가 15초 걸린다고 가정하고,

(http://localhost:8080/orders/1/products/10/update-tx-lock?ms=15000)


이후 B사용자는 걸림없이 ProductId를 5로 수정했다.

(http://localhost:8080/orders/1/products/5/update-tx-lock?ms=0)


이경우 A사용자는 먼저 find가 실행되어 해당 Version을 가지게 되고, B사용자는 늦게 find가 실행되어 A사용자보다 높은 Version을 갖게된다.

A사용자의 경우 OptimisticLock관련 오류가 throw되게 되고, B사용자의 ProductId로 업데이트된다.


B실행후, A가 끝나기전 중간에 find만 할경우는 Update가 완료된 B사용자의  ProductId가 적용되어 보이게된다.

(http://localhost:8080/orders/1?ms=0)


...

@EntityListeners(AuditingEntityListener.class)

@Table(name = "orders")

public class Order extends AuditingEntity {

....

@Version

private Long version;

}


....

전체 소스 https://github.com/eclipse4j/SpringDataJPA-Tips