IT이야기/데이터베이스

락(LOCK) 기법: 데이터 동시성을 보장하는 핵심 기술

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

🔹 락(LOCK) 기법이란?

1. 락(LOCK) 기법의 정의

락(LOCK)은 데이터베이스에서 여러 트랜잭션이 동시에 같은 데이터를 읽거나 변경할 때, 데이터 무결성을 유지하기 위해 적용되는 동시성 제어(Concurrency Control) 기술입니다.
즉, 하나의 트랜잭션이 특정 데이터에 대한 작업을 수행하는 동안 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 제한하는 방식입니다.

락 기법의 주요 목적:

  • 데이터 무결성(Integrity) 보장
  • 데이터 일관성(Consistency) 유지
  • 트랜잭션 간의 충돌 방지
  • 데이터 동기화(Synchronization) 유지

📌 락은 은행 계좌 이체, 주문 처리, 재고 관리 등에서 중요한 역할을 함


🔹 락의 주요 유형

락은 크게 공유 락(Shared Lock, S)과 배타 락(Exclusive Lock, X)으로 구분됩니다.

1. 공유 락(Shared Lock, S) – 읽기 허용, 쓰기 제한

  • 다른 트랜잭션이 동일한 데이터를 읽을 수 있지만, 쓰기는 불가능함
  • SELECT 문에서 WITH (ROWLOCK, HOLDLOCK)을 사용하여 적용 가능

✔️ 공유 락 예제 (SQL)

SELECT * FROM Accounts WITH (HOLDLOCK);

📌 공유 락이 설정되면 다른 트랜잭션이 해당 데이터를 읽을 수 있지만, 수정은 불가능함


2. 배타 락(Exclusive Lock, X) – 읽기 및 쓰기 제한

  • 한 트랜잭션이 특정 데이터에 대해 배타 락을 설정하면, 다른 트랜잭션이 해당 데이터를 읽거나 수정할 수 없음
  • UPDATE, DELETE 문에서 자동으로 적용됨

✔️ 배타 락 예제 (SQL)

UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;

📌 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터에 접근하지 못함


🔹 락의 적용 범위 (Lock Granularity)

락은 적용되는 범위에 따라 다양한 수준(Levels)에서 설정될 수 있습니다.

락 수준 설명
테이블 락 (Table Lock) 테이블 전체를 락으로 설정
페이지 락 (Page Lock) 특정 페이지(블록) 단위로 락을 설정
행 락 (Row Lock) 특정 행(Row)에만 락을 설정

📌 일반적으로 행 락(Row Lock)이 가장 세밀하게 적용되며, 동시성 처리에 유리함

✔️ 테이블 락 적용 예제

SELECT * FROM Orders WITH (TABLOCK);

✔️ 행 락 적용 예제

SELECT * FROM Orders WITH (ROWLOCK);

📌 TABLOCK은 전체 테이블을 락으로 설정, ROWLOCK은 특정 행만 락으로 설정


🔹 락의 모드 (Lock Modes)

락에는 다양한 모드가 존재하며, 트랜잭션의 특성에 따라 선택적으로 적용됩니다.

락 모드 설명
공유 락 (S) 다른 트랜잭션이 읽기는 가능하지만, 쓰기는 제한됨
배타 락 (X) 다른 트랜잭션의 읽기 및 쓰기를 모두 제한
의도적 공유 락 (IS) 특정 레코드에 공유 락을 설정하기 위한 사전 선언
의도적 배타 락 (IX) 특정 레코드에 배타 락을 설정하기 위한 사전 선언
업데이트 락 (U) 공유 락과 배타 락 중간 형태로, 일시적인 업데이트를 허용

📌 업데이트 락은 교착 상태(Deadlock)를 방지하는 데 유용함

✔️ 업데이트 락 예제

SELECT * FROM Customers WITH (UPDLOCK);

🔹 교착 상태(Deadlock)와 해결 방법

1. 교착 상태(Deadlock)란?

  • 두 개 이상의 트랜잭션이 서로의 락을 기다리면서 무한 대기 상태에 빠지는 현상
  • 예: 트랜잭션 A는 데이터 X에 락을 설정, 트랜잭션 B는 데이터 Y에 락을 설정한 후 X를 기다리는 경우

✔️ 교착 상태 발생 예제

-- 트랜잭션 A
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1001;
WAITFOR DELAY '00:00:05';
UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 1002;
COMMIT;

-- 트랜잭션 B
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 1002;
WAITFOR DELAY '00:00:05';
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1001;
COMMIT;

📌 트랜잭션 A와 B가 서로 상대방의 락이 해제되길 기다리면서 교착 상태 발생


2. 교착 상태 해결 방법

✔️ 타임아웃 설정

SET LOCK_TIMEOUT 5000;

📌 5초 동안 락이 해제되지 않으면 트랜잭션이 중단됨

✔️ 트랜잭션 순서 통일 (Deadlock Prevention)

  • 모든 트랜잭션이 동일한 순서로 락을 획득하도록 유도하면 교착 상태를 방지할 수 있음

✔️ 낮은 격리 수준 사용 (Deadlock Avoidance)

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

📌 격리 수준을 낮추면 교착 상태가 줄어들 수 있음


🔹 락의 실무 활용 사례

1. 전자상거래 시스템에서 주문 동시 처리

📌 활용:

  • 동일한 제품을 동시에 주문하는 경우, 락을 사용하여 재고 초과 문제 방지

✔️ SQL 코드:

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

2. 은행 계좌 동시 입출금 처리

📌 활용:

  • 동일한 계좌에서 여러 사용자가 동시에 출금을 시도하는 경우, 배타 락을 설정하여 데이터 정합성 유지

✔️ SQL 코드:

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

📌 결론

락(LOCK) 기법은 데이터베이스의 동시성을 제어하고, 트랜잭션 간 충돌을 방지하는 필수적인 기술이다.
공유 락(S), 배타 락(X) 등 다양한 락을 활용하여 데이터 정합성을 유지할 수 있다.
교착 상태(Deadlock) 문제를 방지하기 위해 트랜잭션 순서를 조정하고 타임아웃을 설정해야 한다.
전자상거래, 금융, 물류 시스템 등에서 락을 적절히 활용하면 성능과 안정성을 동시에 확보할 수 있다.