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

2023. 5. 10. 14:15
반응형

데이터베이스의 충돌 상황

우리는 데이터베이스에 일련의 연산을 통해 데이터를 변경한다.

그 때, 동시에 데이터베이스에 접근하여 수정을 요청하면 충돌이 일어날 수 있다.

이런 충돌에 대비하기 위해서 낙관적 락과 비관적 락에 대해서 알아보도록 하자. 

 

 

낙관적 락

낙관적 락은 충돌을 난 것을 감지할 때 처리하자는 방법이다.

일반적으로 테이블의 Version 컬럼이나 Timetable 등 데이터의 상태 구분 컬럼을 이용한다.

트랜잭션이 시작할 때 구분 컬럼을 읽은 후, 트랜잭션이 끝난 시점에서 변경 여부를 확인한다. 

만약 구분 컬럼이 도중에 변경되었을 시 충돌을 감지하고, 변경 내용을 롤백하게 된다.

 

장점

  • 충돌이 거의 나지 않는 환경에서 처리 성능이 비관적 락에 비해서 좋다.
  • 다른 트랜잭션이 데이터에 접근하는 것을 제어하지 않기 때문에 동시성이 높다. 

단점

  • 충돌을 방지하지 못한다
  • 충돌 시 롤백처리를 해야한다.
  • 충돌이 빈번할 경우 오히려 처리 비용이 크다.

 

 

비관적 락

충돌 문제가 발생할 것이라고 생각하는 자원에 Lock을 걸어 사용하는 방법이다.

트랜잭션이 어떤 자원을 읽을 때 Lock을 걸면, 다른 트랜잭션에서는 자원의 접근이 제한된다.

SQL문으로는 SELECT FOR UPDATE나 SELECT FOR SHARE를 통해 선택한 해당 자원은 내 트랜잭션이 끝날 때 까지 사용할 것이므로 제한할 것이라고 명시한다.

 

공유락과 베타락

공유락 : 조회한 데이터에 대한 WRITE를 제한한다.

베타락 : 조회한 데이터에 대한 다른 트랜잭션에서의 READ/WRITE를 제한한다.

 

장점

  • 데이터의 일관성을 보장할 수 있다.
  • 데이터베이스 격리 수준을 보장하고 높일 수 있다.
    • 데이터베이스 Isolation 수준이 SERIALIZABLE일 때에도, 공유락을 사용하므로 다른 트랜잭션에서의 Write를 막을 뿐 Read는 가능한 상태이다. 베타락을 사용한다면 Read도 막을 수 있다.
  • 데이터베이스의 격리 수준은 아래의 포스팅을 참고하자

https://sjh9708.tistory.com/40

 

[Database] 트랜잭션(Transaction), ACID 및 Isolation Level

트랜잭션 (Transaction) 하나의 로직을 처리하는 SQL 질의들을 집합으로 묶어, 도중에 예외가 발생할 경우 Rollback 처리를, 모두 성공할 경우 Commit 처리하는 실행 단위이다. 쇼핑몰에서 주문할 때의 과

sjh9708.tistory.com

 

단점

  • 다른 트랜잭션이 데이터를 사용하지 못해, 동시성이 낮아진다.
  • 대규모 트래픽에서의 성능 저하 가능성이 있다.
  • 트랜잭션끼리 서로 다른 자원을 선점 시, 데드락이 걸릴 위험성이 있다.

 

 

 

 

 

 

상호 배제와 데드락

https://sjh9708.tistory.com/12

 

[C#, 운영체제] 멀티 쓰레드 환경에서의 상호 배제(Mutex)와 데드락

멀티 스레드 환경의 프로그램에서 공유 자원 접근에 대한 제어를 하는 것은 중요하다. 특히 순서가 중요한 일련의 과정에서의 임계구역에 대한 접근은 엄격하게 이루어져야 한다. 임계 영역과

sjh9708.tistory.com

 

 

 

반응형

BELATED ARTICLES

more