IT이야기/데이터베이스

배타 제어(Exclusive Control): 동시성 충돌을 방지하는 데이터 관리 기법

Chiba-in 2025. 2. 28. 16:00

🔹 배타 제어(Exclusive Control)란?

1. 배타 제어의 정의

배타 제어(Exclusive Control)란 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때, 데이터 충돌을 방지하기 위해 한 트랜잭션이 완료될 때까지 다른 트랜잭션의 접근을 제한하는 기법입니다.
즉, 하나의 트랜잭션이 특정 데이터에 대한 변경 작업을 수행하는 동안 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 막는 방식입니다.

배타 제어의 주요 목적:

  • 트랜잭션 간 충돌 방지
  • 데이터 정합성(Integrity) 유지
  • 동시성 제어(Concurrency Control) 강화
  • 교착 상태(Deadlock) 예방 및 성능 최적화

📌 배타 제어는 금융 거래, 재고 관리, 온라인 예약 시스템 등에서 필수적으로 사용됨


🔹 배타 제어의 주요 개념

1. 동시성 제어(Concurrency Control)란?

  • 여러 트랜잭션이 동시에 실행될 때, 데이터 충돌을 방지하고 데이터 일관성을 유지하는 기법
  • 배타 제어는 대표적인 동시성 제어 방법 중 하나

✔️ 동시성 문제 예제 (잘못된 처리 결과 발생 가능)

-- 트랜잭션 A
BEGIN TRANSACTION;
SELECT Balance FROM Accounts WHERE AccountID = 1001;  -- 잔액 1000원 조회
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;

-- 트랜잭션 B (A가 완료되기 전에 실행)
BEGIN TRANSACTION;
SELECT Balance FROM Accounts WHERE AccountID = 1001;  -- 여전히 1000원 조회
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
COMMIT;

📌 트랜잭션 A와 B가 동시에 실행되면, 계좌 잔액이 1000원이지만 두 트랜잭션 모두 500원 출금을 시도하여 최종적으로 -500원이 되는 문제가 발생할 수 있음


2. 배타 제어(Exclusive Control)의 동작 방식

배타 제어는 하나의 트랜잭션이 특정 데이터를 수정하는 동안, 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 막는 방식으로 동작합니다.
이 방식은 주로 락(Lock) 기법을 사용하여 구현됩니다.

✔️ 배타 제어 예제 (트랜잭션 충돌 방지)

-- 트랜잭션 A (배타 락 적용)
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
COMMIT;

-- 트랜잭션 B (A가 완료되기 전까지 대기)
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
COMMIT;

📌 트랜잭션 A가 완료될 때까지 트랜잭션 B가 대기하여 충돌 방지


🔹 배타 제어의 방법

배타 제어를 수행하는 주요 방법에는 락(Lock) 기법, 타임스탬프 기법, 낙관적 제어 기법이 있습니다.


1. 락(Lock) 기법 – 가장 널리 사용되는 배타 제어 방법

  • 트랜잭션이 특정 데이터에 대해 락을 설정하여 다른 트랜잭션이 접근하지 못하도록 함
  • 공유 락(Shared Lock, S)과 배타 락(Exclusive Lock, X)으로 구분됨

✔️ 배타 락(Exclusive Lock) 적용 예제

BEGIN TRANSACTION;
UPDATE Accounts WITH (XLOCK) SET Balance = Balance - 500 WHERE AccountID = 1001;
COMMIT;

📌 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터를 읽거나 수정하지 못하도록 함

✔️ 공유 락(Shared Lock) 적용 예제

SELECT * FROM Accounts WITH (HOLDLOCK);

📌 다른 트랜잭션이 데이터를 수정하지 못하도록 제한하지만, 읽기는 가능


2. 타임스탬프 기법 – 트랜잭션 간 실행 순서를 조정

  • 각 트랜잭션에 타임스탬프를 부여하여 실행 순서를 결정하는 기법
  • 트랜잭션의 충돌을 줄이고 동시 실행을 가능하게 함

📌 일반적으로 금융권 및 대량 트랜잭션을 처리하는 환경에서 사용


3. 낙관적 제어(Optimistic Concurrency Control, OCC) – 충돌 가능성이 낮은 경우 적용

  • 트랜잭션이 데이터 변경을 수행한 후, 충돌이 발생하면 롤백하는 방식
  • 락을 사용하지 않으므로 성능이 우수하지만, 충돌 발생 시 트랜잭션이 재시도될 수 있음

✔️ 낙관적 제어 예제 (충돌 발생 시 롤백 처리)

BEGIN TRANSACTION;
UPDATE Inventory SET Stock = Stock - 1 WHERE ProductID = 5001;
IF @@ROWCOUNT = 0 ROLLBACK;
COMMIT;

📌 데이터 충돌이 감지되면 ROLLBACK 수행


🔹 배타 제어의 실무 활용 사례

1. 온라인 쇼핑몰에서 재고 동시 처리 방지

📌 활용:

  • 여러 사용자가 동시에 동일한 상품을 주문할 경우, 배타 제어를 적용하여 재고 초과 문제 방지

✔️ SQL 코드:

BEGIN TRANSACTION;
SELECT Stock FROM Inventory WITH (XLOCK) WHERE ProductID = 5001;
UPDATE Inventory SET Stock = Stock - 1 WHERE ProductID = 5001;
COMMIT;

📌 배타 락(XLOCK)을 설정하여 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 접근하지 못하도록 함


2. 은행 시스템에서 계좌 동시 출금 방지

📌 활용:

  • 여러 사용자가 동시에 동일한 계좌에서 출금을 시도할 경우, 배타 제어를 적용하여 초과 출금 방지

✔️ SQL 코드:

BEGIN TRANSACTION;
UPDATE Accounts WITH (XLOCK) SET Balance = Balance - 500 WHERE AccountID = 1001;
COMMIT;

📌 XLOCK을 설정하여 다른 트랜잭션이 해당 계좌에 접근하지 못하도록 제어


📌 결론

배타 제어(Exclusive Control)는 데이터베이스의 동시성 문제를 해결하기 위해 사용되는 핵심 기법이다.
락(Lock) 기법, 타임스탬프 기법, 낙관적 제어(OCC) 등 다양한 방식이 존재하며, 각각의 장단점이 있음.
전자상거래, 금융 시스템, 예약 시스템 등에서 배타 제어를 활용하면 데이터 무결성을 유지할 수 있음.
교착 상태(Deadlock)를 방지하기 위해 타임아웃 설정, 트랜잭션 순서 조정 등의 전략이 필요함.