낙관적 락과 비관적 락

Gunjoo Ahn·2023년 10월 15일
0
post-custom-banner

JPA는 데이터베이스 트랜잭션 격리 수준을 Read Committed 정도로 가정한다. 만약 일부 로직에 더 높은 격리 수준이 필요하면 낙관적 락과 비관적 락 중 하나를 사용하면 된다.

낙관적 락

트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하고 충돌이 발생한 이후 대처를 하는 방법이다. 데이터베이스가 제공하는 락 기능을 사용하는 것이 아니라 JPA가 제공하는 버전 관리 기능을 사용하며, @Version 어노테이션을 사용하면 된다.

쉽게 이야기해서 애플리케이션이 제공하는 락이다.

낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다.

비관적 락

트랜잭션의 충돌이 발생한다고 가정하고 우선 락을 걸고 보는 방법이다. 데이터베이스가 제공하는 락 기능을 사용한다. 대표적으로 select for update 구문이 있다.

Second Lost Update Problem

두 번의 갱신 분실 문제이다. A가 수정하는 중에 B가 수정을 시작했을 때, A가 커밋하고 다음에 B가 커밋하면 A의 수정 사항이 어떻든 마지막 수정 사항인 B의 내용만 반영되게 되는 문제이다.

트랜잭션만으로는 문제를 해결할 수 없다. 이때는 세 가지 선택 방법이 있다.

  • 마지막 커밋만 인정하기: A의 내용은 무시하고 마지막에 커밋한 B의 내용만 인정한다.
  • 최초 커밋만 인정하기: A의 내용을 보전하고 나중에 B가 수정한 내용을 커밋할 때 에러를 발생한다.
  • 충돌하는 갱신 내용 병합하기: A의 수정 내용과 B의 수정 내용을 병합한다.

기본은 마지막 커밋만 인정하기가 사용된다.

profile
Backend Developer
post-custom-banner

0개의 댓글