본문 바로가기

연재작/Database

Transaction Deep Dive (1)

1. Pessimistic, Optimistic Concurrency Control(Lock)

 

  • Pessimistic Concurrency Control : 요약하자면 Lock 체크 후 작업. 그렇기에 성능이 하락, 쓰기 비중이 높을 때 사용
    DB 빌트인 방식 : DB의 무결성, 일관성의 책임을 DB가 갖는다.
    • 단위 : Table 단위 / Row 단위 Lock이 있다.
    • 범주 :
      • Shared Lock(s-lock, 읽기 잠금) : 다중 읽기 가능, 쓰기 작업 트랜잭션 불가
      • Exclusive Lock(x-lock, 쓰기 잠금) : 해당 잠금 중에는 모든 트랜잭션 접근 불가
  • Optimistic Concurrency Control : 같은 방식으로 선 작업 후 버전 체크.
    개발자가 DB 일관성의 책임을 가질 수 있다.
    • 읽기 비중이 높을 때 사용한다.

 

 

2. MVCC

 

MVCC : Multi-Version Concurrency Control이다.

version의 방식에는 timestamp based, transaction ID 등등 여러가지 방식으로 버전을 매긴다.

버전을 매기는 이유는 불필요한 읽기 수준에서의 lock을 없애고자 사용하는 방식이다.

기본 개념 자체가 optimistic concurrency control이다. 락을 하지 않는다. 

다만 이렇게 될 경우 DB가 일관성을 보장하지 않아 데이터의 무결성이 깨질 수 있기 때문에,

rollback이 필요한 상황이 발생했을 경우 이를 개발자에게 구현하는 것을 필요로 하는 것이다.

 

 

 

 

3. 현대 RDBMS는 MVCC를 어떻게 이용하는가?

 

전통적인 RDBMS는 데이터의 무결성 보장과 일관성 지원을 위해 기본적으로 pessimistic lock인 transaction을 기반으로 한다.

하지만 현대의 RDBMS는 성능을 위해서 serializable에 optimistic concurrency control의 해결책 중 하나인 MVCC를 얹은 느낌으로 사용되고 있다. 

 

MVCC로 버전을 매긴 후에, 현대 RDBMS에서 이를 어떻게 사용하는지를 알아보겠다.

(아래부터의 내용은 MySQL의 innoDB를 기반으로 한 내용이다.)

 

변동사항이 생겼을 때 이전 버전의 DB의 내용을 undo 로그라는 추가 저장소를 만들어 그곳에 저장하고,

현재 테이블에는 변경 사항을 업데이트하는 내용이다.

이렇게 추가로 생성한 undo 로그는 rollback할 때를 위해서 사용된다.

그리고 RDBMS에서는 rollback할때 뿐만 아니라 읽기 작업 트랜잭션에서 성능을 위해 이를 사용한다.

가령 L1 트랜잭션인 READ COMMITTED에서는 커밋된것만을 읽어서 읽기수준에서의 Lock을 진행하지 않고,

L2 트랜잭션인 REPEATABLE READ에서는 커밋여부와 상관없이 undo 로그에 있는 이전의 데이터를 읽는다.

이로써 읽기 시 트랜잭션에서 L0수준의 성능과 일관성을 보장하게 되는 것이다.

 

한편, redo 로그라는 것도 있다. 이는 commit이 되어있는 최신의 정보를 redo 로그에 업데이트한다.

redo 로그는 주로 DB상의 장애가 발생시, 혹은 백업 후 데이터 복구를 위해서 사용되는 로그이다.

 

다만 CS에서 공간 복잡도와 시간 복잡도가 trade-off이라는 것을 감안할 때

이와 같이 추가 저장소가 필요할 경우 성능(시간복잡도)는 낮아지지만,

그만큼 저장해야할 용량(공간복잡도)이 늘어나기 때문에 이러한 부분은 감안해야 한다.

또한, undo 로그의 내용을 주기적으로 Garbage Collection을 통해 정리해주어야 한다. (DB에서 지원)

 

 

https://www.linkedin.com/pulse/understanding-mvcc-mysql-innodb-dat-nguyen-hepic

 

Understanding MVCC in MySQL InnoDB

Introduction to MVCC Multi-Version Concurrency Control (MVCC) is a crucial technique in database management systems, including MySQL's InnoDB storage engine, which enhances concurrency and ensures data consistency and isolation by maintaining multiple vers

www.linkedin.com

 

https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

 

트랜잭션의 격리 수준(isolation Level)이란?

 

nesoy.github.io

 

'연재작 > Database' 카테고리의 다른 글

Persistence Context의 Entity 상태 관리, Life-Cycle  (1) 2024.11.28
Transaction Deep Dive (5)  (0) 2024.11.28
Transaction Deep Dive (4)  (0) 2024.11.26
Transaction Deep Dive (3)  (0) 2024.11.23
Transaction Deep Dive (2)  (0) 2024.11.22