Spring & JPA

[테코톡] Lock & JPA Lock

진진리 2025. 4. 5. 13:58

출처: https://www.youtube.com/watch?v=LDi5muN2kgI&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=186

 

 

Lock은 무엇일까?

데이터 수정을 위한 커넥션이 여러 개 존재할 때 데이터 일관성의 문제가 발생 -> 이를 해결하기 위한 메커니즘

 

 

Lock과 Transaction?

  • Lock: 일관성 보장, 동시성 제어 메커니즘
  • 트랜잭션: 원자성 보장 (All or Nothing)
    • 트랜잭션 격리 수준: 여러 트랜잭션에 대하여 각 트랜잭션 처리 전략
    • 구현 방법 중 하나가 락

 

Lock 전략

  • 낙관적 Lock(=애플리케이션 Lock): 트랜잭션 충돌이 발생한 후 조치
  • 비관적 Lock(=데이터베이스 트랜잭션 Lock): 트랜잭션 충돌을 가정하고 사용하는 전략

 

JPA 에서의 낙관적 & 비관적 락

쿠폰 5장을 20명의 사용자가 동시에 발급 -> 20개 쿠폰이 발급됨

  • 낙관적 락 사용
    • @Version: 엔티티에 접근할 때 값이 1씩 오름
    • 3개 쿠폰이 발급됨 -> 최초의 요청만 성립

 

 

  • 비관적 락 사용
    • @Lock(LockModeType.PESSIMISTIC_WRITE)
    • 5개 쿠폰이 발급됨 -> 나머지 트랜잭션이 대기


적절한 Lock 사용 상황?

 

성능: 비관적 락 < 낙관적 락

하지만 충돌 발생 시 낙관적 락에서 롤백을 해야 하므로 비용이 더 많이 들게 됨

  • 낙관적 락 -> 조회 작업이 많고 동시성 중요, 충돌이 잘 일어나지 않는 경우: 게시글 좋아요, 백오피스 데이터 수정 등
  • 비관적 락 -> 데이터 무결성이 중요, 충돌이 자주 일어나는 상황: 은행 계좌 이체, 공동 편집 문서 저장, 티켓 예매 등