새소식

CS

[매일메일] 데이터베이스 시스템에서 동시성을 제어하는 방법은?

  • -

 데이터베이스 시스템에서 동시성을 제어하는 방법으로는 MVCC(Multi-Version Concurrency Control) Lock-Based Concurrency Control이 있다.

 

MVCC(Multi-Version Concurrency Control)

 

 MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 쓰고 읽을 수 있다. 즉, 각 트랜잭션은 각자만의 스냅샷을 기반으로 데이터를 읽는다. 하지만 이러한 특징 때문에 만약 T1 트랜잭션에서 쓰기 작업을 하고 커밋하지 않은 상태에서 T2에서 해당 변경 사항을 보지 못한다.

 

 MVCC는 읽기 작업 시 락을 사용하지 않아 높은 동시성을 제공한다. 즉 읽기 작업은 락에 의해 지연되지 않아 읽기 위주의 작업이 많은 애플리케이션에서 좋은 성능을 보일 수 있다. 기존의 방식으로는 읽기 락(공유 락)이 걸리면 쓰기 락(베타 락)이 걸려 쓰기 작업과의 충돌이 생길 수 있었다. 하지만 MVCC는 읽기 작업 시 락을 사용하지 않으므로 쓰기 작업과의 충돌이 줄어든다.

 

 

 

[매일메일] 공유 락 vs 배타 락

공유 락(Shared Lock,  Read Lock)과 배타 락(Exclusive Lock, Write Lock)은 비관적 락의 데이터 일관성과 무결성을 위해 사용한다.공유 락 vs 배타 락  공유 락은 Read Lock으로도 불리며, 공유 락이 걸린 데이

dockerel.tistory.com

 

 하지만 여러 버전의 데이터를 유지해야 하기 때문에 저장 공간이 더 많이 필요할 수 있다. 그리고 갭락넥스트키 락을 통해 팬텀 리드를 방지할 수 있다. 갭 락은 간단히 말하면 데이터의 일정 범위에 락을 걸어 해당 범위 내에 새로운 데이터가 삽입, 수정, 삭제되는 것을 막아 팬텀 리드를 방지하고, 넥스트키 락특정 행들을 잠그는 레코드 락과 갭 락을 함께 사용하는 것으로 팬텀리드를 방지한다.

 

Lock-Based Concurrency Control

 

 Lock-Based 방식은 데이터 접근 시 락을 사용하여 동시성을 제어한다. 즉, 위 포스트에서 설명한 읽기 락(공유 락)쓰기 락(베타 락)을 통해 동시성을 제어한다. 이때 만약 다수의 트랜잭션이 동시에 같은 데이터에 접근할 경우 성능 저하가 발생할 수 있으며, 락의 획득 순서나 잘못된 설계로 인해 데드락이 발생할 위험도 존재한다.

 

그러면 둘 중 뭘 사용해야 할까?

 

 MySQL의 InnoDB와 같은 실제 데이터베이스 시스템은 MVCC와 Lock-Based 방식의 장점만 사용하여 동시성 제어를 최적화한다. 트랜잭션을 읽기 트랜잭션쓰기 트랜잭션으로 나누어 읽기 트랜잭션은 MVCC 방식을 사용하여 잠금을 최소화하고 동시성을 높히고, 쓰기 트랜잭션 방식은 락을 사용하여 데이터의 일관성과 무결성을 유지하면서 데이터의 충돌을 방지한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.