Dev./persistence

[DB] 낙관적 락과 비관적 락

인쥭 2023. 10. 10. 09:14
반응형

낙관적 락

  • 동시성 문제가 일반적으로 발생하지 않을 것으로 보고(=낙관적), 락을 걸지 않고 시작한다.
  • 별도의 Version 컬럼을 두고, 트랜잭션을 커밋할 시점에 동시성 문제가 발생했는지 검증한다.
  • 트랜잭션을 커밋할 때까지 동시성 문제가 발생함을 알 수 없으며, 발생한 경우 애플리케이션 로직으로 처리한다.

비관적 락

  • 동시성 문제가 빈번히 발생할 것으로 보고(=비관적), 트랜잭션을 시작할 때 락을 걸고 시작한다.
  • select for update와 같은 쿼리를 활용하며, 데이터베이스가 제공하는 락을 활용한다.

낙관 vs 비관

  • 두 개념은 각각 다음과 같은 장단점을 가지므로, 상황에 맞게 무엇을 사용할지 결정해야 한다.
    • 낙관적 락은 일반적인 상황에서 성능이 더 좋으나, 충돌 발생시 이를 처리하기 번거롭다.
    • 비관적 락은 데드락이 발생할 수 있으나, 충돌이 자주 발생하는 환경에서의 처리가 쉽다.

둘 중 어떤 락이 항상 더 우월하고, 항상 더 안좋고 하지는 않다는 점에 주의하자!