본문 바로가기
Database

낙관적인 락 vs 비관적인 락

by Jammini 2023. 7. 7.
728x90

목차

  1. 락이란?
  1. 낙관적 락(Optimistic Lock)
  1. 비관적 락(Pessimistic Lock)
  1. 낙관적 락 vs 비관적 락
  1. 결론

1. 락이란?

여러 개의 트랜잭션이 동시에 접근했을 때, 데이터의 일관성이 깨질 수 있기 때문에 락(잠금)을 걸고 이를 관리하는 것을 Locking이라고 한다.

예를 들어, 3000원이 있는 계좌에 A와 B가 3000원을 입금했는데 이 과정이 동시에 이루어져서 A와 B가 동시에 3000원을 읽어서 3000원을 더해버리는 바람에 최종 금액이 9000원이 아니라 6000원이 되버리는 현상을 막기 위해 필요하다.

2. 낙관적 락(Optimistic Lock)

  • 낙관적인 락은 데이터를 읽을 때는 락을 걸지 않고, 데이터를 업데이트할 때 충돌이 발생하지 않았는지 확인하는 방식이다.
  • 데이터를 읽을 때는 다른 트랜잭션이 데이터를 수정하지 않을 것으로 가정하고 락을 걸지 않는다.
  • 데이터를 업데이트할 때 실제로 락을 확인하고 충돌이 발생하면 롤백 또는 충돌을 해결하는 방법을 적용한다.
  • 낙관적인 락은 동시성이 높은 환경에서 성능을 향상시킬 수 있지만, 충돌이 발생할 가능성이 높은 경우 롤백이나 재시도가 필요할 수 있다.

기본적으로 데이터 갱신시 충돌이 발생하지 않을 것 으로 간주하는 방식을 Optimistic Lock(낙관적인 락)이라고 한다.

설명 그대로 데이터 갱신시 충돌이 발생하지 않을 것이라고 예상하기 때문에, 락을 걸지 않는다.

낙관적인 락은 Version을 사용해 관리한다.

  1. Alice와 Bob이 같은 데이터를 읽어 Version1 값을 가져간다.
  1. Bob이 먼저 업데이트 커밋을 보내게 되면서 Version이 2로 올라간다.
  1. Alice도 업데이트 커밋을 날리면서 Version을 2로 올린다.
  1. 이미 Version 2가 존재하기 때문에 Optimistic Lock Exception이 터진다.

3. 비관적 락(Pessimistic Lock)

  • 비관적인 락은 데이터를 읽을 때부터 락을 걸고, 업데이트가 완료될 때까지 락을 유지하는 방식이다.
  • 데이터를 읽을 때 락을 걸기 때문에 다른 트랜잭션이 해당 데이터를 읽거나 수정할 수 없다.
  • 비관적인 락은 데이터 충돌을 최소화하지만, 동시성이 낮아질 수 있고, 락 경합이 발생할 경우 성능 저하가 발생할 수 있다.

기본적으로 데이터 갱신시 충돌이 발생할 것 으로 보고 미리 잠금을 하는 방식을 Pessimistic Lock(비관적인 락)이라고 한다.

설명 그대로 데이터 갱신시 충돌이 발생할 것으로 예상하고, 우선적으로 락을 건다.(조회 시점부터)

  1. 운영자가 주문 정보를 조회한다. 이 순간 데이터에 락이 걸린다.
  1. 고객이 같은 주문 정보를 조회하지만 락이 걸려있기에 대기한다.
  1. 운영자가 작업을 끝내고 잠금을 해제하면 이때, 고객의 로직이 수행된다.

무결성에 장점이 있지만 데드락의 위험성이 존재하게 된다.

비관적인 락에 아래와 같이 추가 설정이 가능하다.

  • Exclusive Lock
    • 위에서 설명한 그림
    • 다른 사용자가 읽기, 수정, 삭제 모두 불가능
  • Shared Lock
    • 다른 사용자가 동시에 읽을 수는 있지만, Update, Delete 작업은 방지

4. 낙관적 락 vs 비관적 락

구분Optimistic LockPessimistic Lock
정의충돌이 없을 것으로 가정하여 락을 걸지 않음충돌을 예상하고 미리 락을 검
사용법JPA 사용시 @Version 동작 원리가 단순해 Mybatis의 경우 직접 만들어 사용Mode 설정 및 쿼리에 직접 사용, DB단에서 설정 가능
별칭낙관적인 락 / 비선점적인 락비관적인 락 / 선점적인 락
장점데드락 가능성이 적으며 성능의 이점충돌에 대한 오버헤드가 줄어들며 무결성을 지키기 용이
단점충돌이 발생하면 오버헤드 발생충돌이 없으면 오버헤드가 발생

5. 결론

  • 읽기와 수정의 비율이 어디에 가까운지를 잘 판단해서 결정해야 한다.
  • 수정의 비율이 높다면 Pessmistic Lock을 사용하고 읽기의 비율이 높다면 Optimistic Lock을 사용한다.
  • 일반적으로 웹 애플리케이션은 주로 읽기 수행작업이 많기 때문에 Optimistic Lock을 주로 사용한다.

참고

반응형

'Database' 카테고리의 다른 글

MySQL Index에 대해 알아보자  (0) 2023.11.07
MYSQL __SELECT FOR UPDATE__  (0) 2023.08.04
Mybatis #과 $차이  (0) 2023.06.30
JOIN의 종류(INNER, OUTER, CROSS, SELF JOIN)  (0) 2023.06.23
트랜잭션 MySQL Isolation level  (0) 2023.06.14