[Spring JPA] 비관적 락, 낙관적 락 공부하기

2023. 4. 11. 11:17몰랐던거/JAVA & SPRING


비관적 락, 낙관적 락 이란?

 

비관적 락

비관적 락은 충돌이 일어날 것이다 비관적으로 생각해서 미리 락을 걸어주는 방법입니다.

하나의 트랜잭션이 자원에 접근 시 락을 걸고 다른 트랜잭션이 접근하지 못하게 합니다. 이 때 Shared Lock과 Exclusive Lock 두 가지를 걸 수 있습니다.

  • Shared Lock은 다른 트랜잭션에서 읽기만 가능하고 다른 트랜잭션의 Shared Lock과 자원을 공유합니다. 하지만 Exclusive Lock은 접근할 수 없습니다.
  • Exclusive Lock은 읽기, 쓰기 다 공유하지 않습니다.

장점

  • 충돌이 많은 경우 롤백 횟수를 줄여 성능적인 측면에서 좋습니다.
  • 데이터 일관성과 무결성을 보장하는 수준이 매우 높습니다.

단점

  • 읽기 작업이 많은 로직의 경우엔 동시성이 떨어지기 때문에 성능이 좋지 않습니다.
  • 락을 거는 순서가 다른 경우에 데드락이 발생할 수 있습니다.

낙관적 락

낙관적 락은 충돌이 일어나지 않을 것이다 낙관적으로 생각해서 자원에 락을 걸지 않고 충돌이 발생했을 때 이를 처리하는 방법입니다.

일반적으로 version이라는 컬럼을 추가하여 구현합니다. 처음 데이터를 조회했을 때의 version과 커밋할 때의 version이 다르다면 UPDATE 쿼리가 실패하게 되고 이에 대한 롤백 처리를 수행합니다.

이는 DB에서 동시성을 처리하는 것이 아니라 애플리케이션 단에서 처리하는 방법입니다.

 

장점

  • 충돌이 적은 경우 동시성에 대해서 성능적으로 우수합니다.

단점

  • 충돌이 많은 경우 롤백처리에 대한 비용이 많이 들어 성능적으로 불리해집니다.
  • 롤백 처리 구현이 어려울 수 있습니다.

마무리

프로젝트를 하면서 비관적 락과 낙관적 락을 이용해서 동시성 이슈를 해결한 경우가 많은데 확실하게 머리 속에서 정리되지 않은 것 같아서 공부를 해봤습니다.

공부를 하면서 느낀 부분은 비관적 락을 주로 사용해야겠다였습니다. 

그 이유는 서비스 운영에서 가장 중요한 것은 데이터 일관성과 무결성이라는 생각이 들었고 낙관적 락의 경우엔 롤백 구현이 잘못된다면 이런 부분이 무너질 수 있다는 생각이 듭니다.

 

Reference

https://unluckyjung.github.io/db/2022/03/07/Optimistic-vs-Pessimistic-Lock/

 

낙관적(Optimistic) 락과 비관적(Pessimisitc)락

낙관적(Optimistic) 락과 비관적(Pessimisitc)락 두 락의 차이를 알아봅니다.

unluckyjung.github.io

 

'몰랐던거 > JAVA & SPRING' 카테고리의 다른 글

[OOP] Visitor 패턴 정리하기  (0) 2022.12.09
[OOP] Command 패턴 정리하기  (0) 2022.12.09
[OOP] Observer 패턴 정리하기  (0) 2022.11.12
[JAVA] JAVA에서의 Data Type  (0) 2022.11.12
[OOP] Proxy 패턴 정리하기  (0) 2022.11.10