Server

낙관적인락(Optimistic Locking) / 비관적인(Pessimistic Locking)

Raconer 2023. 8. 9. 13:18
728x90

낙관적인 락(Optimistic Locking):

서버에서 락을 제어 한다.

  • JPA -> @Version 속성 사용
  • Mybatis -> update_reg_date 같은 컬럼으로 제어 (JPA @Version 과 비슷하다.)
  • 사용 예시
    • 은행 계좌 잔액 변경: 여러 사용자가 동시에 계좌 잔액을 변경할 수 있지만 충돌이 발생할 가능성이 낮은 경우
  • 특징:
    • 데이터를 읽을 때 락을 걸지 않고 읽은 후 업데이트 시에 일관성을 확인
    • 충돌이 발생할 경우 재시도(retry)를 통해 해결
    • 데이터의 버전 관리 필요 (버전 번호 또는 타임스탬프)
  • 장점:
    • 읽기 성능 향상
      • 데이터를 읽을 때 락을 걸지 않아 동시성이 높아짐
    • 충돌 발생 시 재시도를 통해 해결 가능
  • 단점:
    • 재시도 로직 필요
    • 데이터의 일관성을 확인하기 위한 버전 관리 추가 필요
    • 충돌 시 롤백 또는 예외 처리

비관적인 락(Pessimistic Locking):

DB 내에서 읽기/쓰기를 잠근다.

읽기 -> 공유 락(Shared Lock)/ 읽기 락(Read Lock)

쓰기 -> 배타 락 (Exclusive Lock) / 쓰기 락(Write Lock)

  • 사용 예시:
    • 호텔 예약: 여러 사용자가 동시에 호텔 예약을 시도할 때 충돌이 발생할 가능성이 높은 경우
  • 특징:
    • 데이터를 읽을 때 락을 걸어 다른 트랜잭션이 해당 데이터를 수정하지 못하도록 제어
    • 트랜잭션이 종료될 때까지 데이터를 독점적으로 사용
  • 장점:
    • 데이터 일관성 보장: 동시 접근 시 충돌 방지하여 데이터 무결성 유지
    • 특정 데이터에 대한 독점적인 접근 가능
  • 단점:
    • 성능 저하: 락을 사용하므로 동시성이 낮아짐
    • 데이터 접근 제어 관리 필요
728x90

'Server' 카테고리의 다른 글

[디자인 패턴] 추상 팩토리 패턴  (0) 2024.02.03
CAP 이론  (0) 2024.02.03
[Jmeter]부하 테스트_Window 기준  (0) 2023.05.11
Docker 공부 하면서 주로 사용하는 명령어  (0) 2023.04.16
도커 사용법[2]  (0) 2023.04.16