본문 바로가기
Backend/DB

데이터베이스 락(DB Lock), Exclusive Lock (배타적 락), MVCC (다중 버전 동시성 제어)

by hyhs 2025. 1. 15.
728x90
반응형
SMALL

출처: ChatGPT

질문 답변에 대한 정리


데이터베이스 락(DB Lock)

  •  동시에 여러 사용자가 데이터에 접근하는 상황에서 데이터의 무결성과 일관성을 유지하기 위해 사용

 

1. 데이터를 넣고 있을 때 조회를 막는 경우

  • 이 경우 Exclusive Lock (배타적 락) 또는 Write Lock이 사용
  • 데이터가 수정(삽입, 삭제, 업데이트)되고 있는 동안 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하는 방식

 

  • 구현 방식:
    • 대부분의 DBMS에서 Serializable 수준의 트랜잭션 격리 수준을 설정하면 이러한 동작을 보장합니다.
    • 트랜잭션 내에서 SELECT ... FOR UPDATE 구문을 사용하면 해당 데이터에 락을 걸 수 있습니다.
  • 예제 (MySQL):
START TRANSACTION;
INSERT INTO my_table (id, value) VALUES (1, 'test');
-- 데이터 삽입이 완료되기 전에는 다른 사용자가 해당 데이터를 조회할 수 없음.
COMMIT;

 

 

 

  • 장점:
    • 데이터의 일관성이 보장됩니다.
  • 단점:
    • 조회 요청이 대기 상태에 빠져 성능 저하가 발생할 수 있습니다.

 

2. 조회는 되지만 업데이트 전 데이터를 보여주는 경우

  • 이 경우 Snapshot Isolation 또는 **MVCC (Multi-Version Concurrency Control)**를 사용
  • 대부분의 현대적인 DBMS에서는 MVCC를 지원하여, 트랜잭션이 시작되었을 때의 데이터 스냅샷을 기반으로 작업을 처리

 

  • 특징:
    • 다른 트랜잭션이 데이터를 수정하더라도, 현재 트랜잭션은 트랜잭션 시작 시점의 데이터를 읽습니다.
    • 데이터 변경은 트랜잭션이 커밋되기 전까지 다른 트랜잭션에 영향을 주지 않습니다.
  • 구현 방식:
    • MySQL의 InnoDB 엔진은 MVCC를 지원합니다.
    • 트랜잭션 격리 수준을 REPEATABLE READ로 설정하면 이러한 동작을 구현할 수 있습니다.
  • 예제 (MySQL):
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;
-- 트랜잭션 시작 시점의 데이터 스냅샷을 읽음
SELECT * FROM my_table WHERE id = 1;

-- 동시에 다른 트랜잭션이 데이터를 수정해도, 여기서는 이전 데이터를 계속 봄
COMMIT;

 

  • 장점:
    • 읽기 작업과 쓰기 작업이 동시에 가능하여 성능을 높일 수 있습니다.
    • 데이터 일관성 유지가 가능하며 충돌 방지.
  • 단점:
    • 오래된 스냅샷 데이터를 조회함에 따라 최신 상태가 반영되지 않을 수 있음.

 

DB 락을 사용하는 상황 고려 사항

  1. 어떤 수준의 동시성이 필요한지:
    • 데이터의 정확성이 더 중요한 경우 강한 락(EXCLUSIVE)을 사용.
    • 성능이 중요한 경우 MVCC를 고려.
  2. DBMS에 따라 다름:
    • MySQL, MariaDB: InnoDB의 MVCC를 기본적으로 사용.
    • MSSQL: Lock과 Isolation Level의 조합을 사용.
    • Oracle: Consistent Read를 기본으로 제공.
  3. 락이 과도하면 성능 저하:
    • 가능하면 필요한 범위에만 락을 걸도록 쿼리를 설계.

 


무결성(Integrity)

  • 데이터베이스에서 데이터의 정확성, 일관성, 신뢰성을 보장하는 것

MVCC (Multi-Version Concurrency Control)

  • 다중 버전 동시성 제어를 의미
  • 데이터베이스에서 동시에 여러 트랜잭션을 처리할 때 일관성과 동시성을 보장하기 위해 사용되는 기술
  • 트랜잭션이 데이터를 읽거나 쓰는 동안 다른 트랜잭션이 독립적으로 작동할 수 있도록 

MVCC의 작동 원리

MVCC는 데이터를 수정하거나 삭제할 때, 기존 데이터를 바로 덮어쓰지 않고 새로운 버전을 생성합니다. 이렇게 생성된 여러 버전을 통해 다음과 같은 방식으로 트랜잭션이 처리됩니다:

  1. 트랜잭션 스냅샷(Snapshot):
    • 트랜잭션이 시작되면 데이터베이스는 해당 시점의 데이터 상태를 스냅샷으로 기록합니다.
    • 이후 트랜잭션이 실행되는 동안, 다른 트랜잭션에서 데이터가 변경되더라도 스냅샷 상태를 기준으로 데이터를 조회합니다.
  2. 읽기 작업(Read):
    • 트랜잭션이 시작될 때 스냅샷을 사용하여 데이터의 "과거 버전"을 읽습니다.
    • 따라서, 읽기 작업은 락을 걸지 않고도 일관된 데이터를 제공합니다.
  3. 쓰기 작업(Write):
    • 데이터를 수정할 때 기존 데이터를 덮어쓰지 않고 새 버전을 만듭니다.
    • 다른 트랜잭션에서는 새 버전이 아닌 트랜잭션 시작 시점의 데이터 버전을 계속 사용합니다.
    • 쓰기 충돌은 트랜잭션 커밋 시점에서 확인됩니다.

스냅샷(Snapshot)

스냅샷은 특정 시점의 데이터 상태를 복사한 것을 의미합니다. 데이터베이스에서는 트랜잭션이 실행되는 동안 데이터 일관성을 보장하기 위해 스냅샷을 사용합니다. 스냅샷을 통해 트랜잭션은 자신이 시작된 시점의 데이터 상태를 기준으로 작업하며, 다른 트랜잭션에서 발생한 변경 사항에 영향을 받지 않습니다.

 

스냅샷의 동작 방식

  1. 트랜잭션 시작:
    • 트랜잭션이 시작되면 데이터베이스는 현재 데이터 상태를 스냅샷으로 저장합니다.
  2. 읽기 작업:
    • 트랜잭션은 저장된 스냅샷 데이터를 사용해 읽기 작업을 수행합니다.
    • 다른 트랜잭션이 데이터를 수정하더라도, 현재 트랜잭션은 영향을 받지 않습니다.
  3. 쓰기 작업:
    • 쓰기 작업 시에는 데이터를 직접 수정하지 않고 새로운 버전을 생성합니다.
    • 기존 스냅샷에는 영향을 주지 않습니다.

 

 

728x90
반응형
LIST

댓글