Optimistic Lock(낙관적 락) vs Pessimistic Lock(비관적 락)

윤주훈·2024년 3월 1일

DB

목록 보기
1/2

🍎 동시성

우리는 동시성 문제에 대해서 여러가지 해법을 가질 수 있다. 내가 여태까지 알아온 방식은 ThreadLocal을 사용하여 동시성을 해결하는 방법이었다.다른 방식으로는 어떻게 해결할까? JPA에서도 동시성 문제를 해결할 수 있다.

❓ 어떻게?

  • 바로 낙관적(Optimistic) 락, 비관적(Pessimistic) 락 을 활용하는 사례이다. 예를 한번 살펴보자

🔑 낙관적 락

낙관적 락은 동시성 문제가 발생하지 않을 것이라고 가정하고 , 충돌이 일어났을 시 대처하는 락이다.

  • 처리방법 : @Entity 필드에 @Version 이라는 에노테이션을 달아주면 해당 필드를 Write 할 시 다른 트랜잭션에서 동시에 이 값을 Write 하면 version이 다르게 되어 예외를 발생시켜 롤백을 해주는 방법이다.
  • 애플리케이션 단에서 처리해 주는 방법이다.
@Version
private Integer quantity;
  • 장점 : 락으로 인한 성능 저하가 적다.

🔑 비관적 락

비관적 락은 동시성 문제가 발생할것이라고 미리 가정하고, 실제 데이터 엑세스 전 락을 걸어서 충돌을 예방하는 방식이다.
🐶 여기서 잠깐! 데이터베이스의 락 두가지를 알아보자.

  • SharedLock(공유 락) : 다른 트랜잭션에 읽기만을 허용해주는 락이다. 베타락은 적용할 수 없다.
  • ExclusiveLock(베타 락) : 다른 트랜잭션에 읽기, 쓰기를 허용해주지 않는다.

트랜잭션에서 변경, 쓰기 작업이 끝난 이후에 다른 트랜잭션이 해당 데이터에 접근할 수 있다.

처리방법 : entityManager를 활용하여 메소드를 호출 할때 LockModeType.PESSIMISTIC_WRITE 을 걸어줄 수 있다.

em.find(User.class, id, LockModeType.PESSIMISTIC_WRITE);
  • 장점 : 충돌을 미리 방지할 수 있고, 데이터의 일관성 유지에 용이하다.

🙌 결론

  • 우리는 동시성 문제에 마주쳤을 때 이러한 두가지 락 전략을 통하여 문제에 대해 고민해 볼 수 있다. 성능을 고려하여 낙관적 락 또는 비관적 락을 사용해보자!
profile
Dont regret it will be your future

0개의 댓글