질문&답변
named lock vs 비관적 락
많은 분들이 비관적 락에는 타임아웃(timeout)을 걸 수 없어서 데드락의 위험이 있다고 하지만 동훈님 말씀대로 비관적 락에도 @QueryHint 또는 em.persist에 타임아웃 속성을 걸 수 있습니다. @Lock(LockModeType.PESSIMISTIC_WRITE) @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout",value = "1000")}) @Query("update Member set m.name = :name where id = 1") void update(@Param("name") String name); 우선 비관적 락은 for update 구문으로 레코드 레벨에 잠금을 겁니다. 이렇게 레코드 레벨에락을 걸어버리면 해당 태스크의 트랜잭션 뿐만 아니라 다른 태스크들을 처리하기 위한 커넥션들도 락이 걸린 레코드에 접근하지 못한다는 특징이 있습니다. 반면에 네임드 락의 경우 락의 대상이 테이블이나 레코드 또는 auto_increment와 같은 데이터베이스 객체가 아니라는 점입니다. 네임드 락은 단순히 사용자가 지정한 문자열(String)에 대해 획득하고 반납(해제)하는 잠금입니다. 그렇기 때문에 동시성이 발생하는 트랜잭션에 대해서 동시성 이슈를 안전하게 처리할 수 있으면서, 다른 태스크들을 처리하기 위한 커넥션에는 전혀 영향을 주지 않을 수 있다는 장점이 있어보입니다.
- 좋아요수
- 0
- 댓글수
- 1
- 조회수
- 1414





