Two-Phase Locking (2PL)
2PL은 트랜잭션의 Lock 연산을 두 단계로 나누어 관리하는 프로토콜이다. 첫 번째 단계인 Growing Phase(확장)에서는 Lock을 획득만 할 수 있고 해제는 불가능하며, 두 번째 단계인 Shrinking Phase(수축)에서는 Lock을 해제만 할 수 있고 획득은 불가능하다.
이러한 2PL은 직렬성(Serializability)을 보장하는 대표적인 동시성 제어 기법이다.
A 계좌에서 B 계좌로 100만원을 이체하는 상황을 가정
스키마
CREATE TABLE accounts (
account_id VARCHAR(10) PRIMARY KEY,
account_holder VARCHAR(50) NOT NULL,
balance DECIMAL(15,2) NOT NULL,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE transactions (
tx_id BIGINT PRIMARY KEY AUTO_INCREMENT,
from_account VARCHAR(10),
to_account VARCHAR(10),
amount DECIMAL(15,2),
tx_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (from_account) REFERENCES accounts(account_id),
FOREIGN KEY (to_account) REFERENCES accounts(account_id)
);
확장 단계(Growing Phase) — Lock 획득
이 단계에서는 필요한 모든 Lock을 획득한다. 교착상태(Deadlock)를 방지하기 위해 계좌 번호 순서대로 Lock을 획득하는 것이 중요하다.
SELECT * FROM accounts WHERE account_id = 'A' FOR UPDATE;
SELECT * FROM accounts WHERE account_id = 'B' FOR UPDATE;
확장 단계에서는 SELECT FOR UPDATE 구문을 사용하여 A 계좌와 B 계좌에 대한 배타적 잠금(X-Lock)을 획득한다. 이 잠금은 다른 트랜잭션이 해당 계좌들을 수정하지 못하도록 방지하며, 동시에 현재 계좌의 잔액도 확인할 수 있게 한다.
연산 단계
UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 1000000 WHERE account_id = 'B';
잠금을 획득한 후에는 실제 금액 이체를 위한 UPDATE 작업을 수행한다. A 계좌에서는 100만원을 차감하고, B 계좌에는 100만원을 추가하는 두 개의 UPDATE 쿼리가 실행된다. 이미 두 계좌에 대한 잠금을 획득한 상태이므로, 이 수정 작업은 다른 트랜잭션의 간섭 없이 일관성을 유지하며 수행된다.
수축 단계(Shrinking Phase) — Lock 해제
수축 단계는 2PL의 구현 방식에 따라 Lock 해제 시점이 달라진다:
순수 2PL: Lock을 점진적으로 해제할 수 있다.
Strict-2PL: 모든 Lock을 COMMIT 시점까지 보유하다가 한 번에 해제한다.
Strong Strict-2PL: 모든 X-Lock을 COMMIT/ROLLBACK 시점까지 보유한다.
대부분의 데이터베이스는 데이터 일관성을 보장하기 위해 Strict-2PL이나 Strong Strict-2PL을 구현한다.
COMMIT; -- Strict-2PL의 경우 이 시점에 모든 Lock 해제
수축 단계에서는 COMMIT 명령으로 트랜잭션을 종료하며, 이때 모든 변경사항이 데이터베이스에 확정되고 획득했던 모든 잠금이 자동으로 해제된다. 이는 대기 중이던 다른 트랜잭션들이 진행될 수 있게 하는 중요한 시점이 된다.
참고
2 Phase Locking (2PL) : 네이버 블로그
2 Phase Locking (2PL)
q 2PL(2 Phase Locking) 정의 - 기본 로킹 규약의 문제를 해결하고 트...
blog.naver.com
[Database] DBA급 개발자로 - #16 Two-Phase Locking
[Database] DBA급 개발자로 - #16 Two-Phase Locking
이번 포스팅에서는 트랜잭션 동시성을 제어할 수 있는 방법인 two phase locking에 대해 살펴보겠습니다. 2PL(Two phase locking)은 데이터베이스의 serializable isolation level을 구현하는데 자주 사용됐던 방식
code-run.tistory.com
2 Phase Locking (2PL) : 네이버 블로그
2 Phase Locking (2PL)
q 2PL(2 Phase Locking) 정의 - 기본 로킹 규약의 문제를 해결하고 트...
blog.naver.com
'Databases' 카테고리의 다른 글
트랜잭션 격리수준 (0) | 2025.02.24 |
---|---|
데이터베이스 동시성 제어: MVCC (0) | 2025.02.23 |
수직적 탐색 수평적 탐색 (0) | 2025.02.21 |
NL 조인 (0) | 2025.02.07 |
DELETE vs TRUNCATE (0) | 2025.02.03 |