이론 정리/Database

낙관적/비관적 lock, named lock

철매존 2022. 12. 26. 00:23
728x90
  • pessimistic Lock
    • 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법
    • 이걸 걸면 다른 트랜잭션에서는 lock이 해제되기 전에 데이터를 가져갈 수 없다.
    • 데드락이 걸릴 수 있어 주의 필요
  • Optimistic Lock
    • 실제로 lock을 이용하지 않고 버전을 이용해서 정합성을 맞추는 버전
    • 먼저 데이터를 읽은 후에 update를 수행할 때 내가 읽은 버전이 맞는지 확인하여 업데이트한다.
    • 내가 읽은 버전에서 수정사항이 생기는 경우 application에서 다시 읽은 후에 작업 수행 필요
  • Named Lock
    • 이름을 가진 metadata locking이다.
    • 이름을 가진 lock을 획득한 후 해제할때까지 다른 세션은 이 lock을 획득할 수 없다.
    • transaction이 종료될 때 자동으로 lock이 해제되지 않아 주의 필요
      • 별도의 명령어로 해제를 수행해주거나 선점시간이 끝나야 해제된다.
    • 이거는 Optimistic lock이랑 비슷한데, 다른 점은 metadata를 사용해서 lock을 한다는 것이다.

pessimistic lock

충돌이 빈번하게 일어난다면 Optimistic lock보다 성능이 좋을 수 있다.

별도의 lock을 잡기 때문에 성능에 문제가 발생할 수 있다.

Optimistic lock

별도의 lock을 갖지 않으므로 pessimistic lock보다 성능상 장점이 있다.

update가 실패했을 때 재시도 로직을 개발자가 직접 작성해야 한다.
그리고 충돌이 자주 일어나게 되면 pessimistic lock이 더 나을 것이다.

named lock

Optimistic lock에서는 테이블에 lock을 걸었다면
named lock에서는 아예 lock이라는 것을 따로 만들어주고 이거를 통해 lock을 걸어준다.

Optimistic lock은 timeout을 구현하기 힘들지만, named lock은 이를 쉽게 구현할 수 있다.

이외에 데이터 삽입시 정합성을 맞춰야 하는 경우에도 사용 가능

하지만 Transaction 종료시 lock해제 등을 잘 해주어야 한다.
실제 사용시에는 구현 방법이 굉장히 복잡할 수 있다.