※ Pessimistic Lock and Optimistic Lock.
안녕하세요. 듀스트림입니다.
오늘은 데이터 동시성 제어를 위해 사용되는 주요 접근 방식인 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)에 대해 살펴보겠습니다.
1. 비관적 락 (Pessimistic Lock)
• 비관적 락은 트랜션이 충돌한다 가정하고, 데이터에 우선 락을 걸어 데이터 정합성을 보장하는 방식입니다.
• 비관적 락은 데이터베이스의 물리적인 레벨에서 배타 락(Exclusive Lock)을 설정하여 제어합니다.
• 락을 설정한 동안 다른 사용자는 해당 데이터에 대해 읽기, 쓰기가 제한됩니다.
(다른 트랜잭션이 동일 데이터에 접근하거나 수정하려고 하면 대기합니다.)
• 트랜잭션이 길어질 경우 데드락 발생 가능성이 존재합니다.
1.1. 구현 예제
예제는 PostgreSQL 기준입니다.
-- 트랜잭션 시작
BEGIN;
-- 계좌 정보에 락을 설정
SELECT balance
FROM accounts
WHERE account_id = 1
FOR UPDATE; -- 특정 데이터에 대해 Row-Level Lock 설정
-- 잔액 수정
UPDATE accounts
SET balance = balance - 100
WHERE account_id = 1;
-- 트랜잭션 커밋
COMMIT;
1.2. 응용 사례
• 고정된 자원(예: 은행 계좌)의 충돌 방지.
→ 은행 시스템: 계좌에서 돈을 이체할 때, 동일 계좌를 여러 트랜잭션에서 수정하지 못하도록 보장.
• 배치 작업이나 특정 작업 순서를 엄격히 유지해야 하는 경우.
→ 재고 관리: 특정 상품 재고를 업데이트할 때 다른 트랜잭션의 수정 차단.
2. 낙관적 락 (Optimistic Lock)
• 낙관적 락은 "대부분의 트랜잭션이 충돌하지 않을 것이다" 라는 가정하에 하는 방법입니다.
• 이 방법은 실제 락을 사용하는 것이 아니라 Timestamp 또는 Version을 사용하여 락을 거는 방법입니다.
• 낙관적 락의 가장 큰 특징은 "트랜잭션이 커밋 전까지는 트랜잭션의 충돌을 알 수 없다" 입니다.
2.1. 구현 예제
예제는 PostgreSQL 기준입니다.
-- 테이블 구조 예시
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
stock INT NOT NULL,
version INT NOT NULL DEFAULT 1
);
/** 동시성 제어를 위한 PL/pgSQL 코드 **/
DO $$
DECLARE
v_stock INT;
v_version INT;
BEGIN
-- 현재 데이터 조회
SELECT stock, version
INTO v_stock, v_version
FROM products
WHERE product_id = 1;
-- 특정 조건에 맞는 업데이트 실행
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE product_id = 1 AND version = 5;
-- 업데이트 성공 여부 확인
IF FOUND THEN
-- 성공적으로 업데이트된 경우 커밋
COMMIT;
RAISE NOTICE 'Transaction committed. New stock: %, New version: %', v_stock - 1, v_version + 1;
ELSE
-- 조건 충족하지 못한 경우 롤백
ROLLBACK;
RAISE NOTICE 'Transaction rolled back. Version mismatch or other issue.';
END IF;
END;
$$ LANGUAGE plpgsql;
2.2. 응용 사례
• 전자상거래 시스템: 주문 상태 업데이트 시.
• 분산 시스템: 여러 인스턴스에서 데이터 동시 접근이 많은 환경.
3. 비교 표
| 구분 | 비관적 락 | 낙관적 락 |
| 락 방식 | 데이터에 배타 락 설정 (SELECT ... FOR UPDATE) |
데이터 변경 여부 확인 후 충돌 감지 |
| 충돌 처리 | 충돌 자체를 방지 | 충돌 감지 후 롤백 및 재시도 |
| 데드락 가능성 | 높음 | 없음 |
| 성능 | 동시성 저하 | 동시성 높음 |
| 트랜잭션 길이 | 트랜잭션이 길수록 성능 저하 | 트랜잭션 길이와 무관 |
| 적합한 환경 | 충돌 가능성이 높은 환경 | 충돌 가능성이 낮은 환 |
오늘은 여기까지~
다음 포스팅도 기대해주세요 :)
'IT 여러가지' 카테고리의 다른 글
| IT: RDBMS 반정규화 (2) | 2025.07.08 |
|---|---|
| IT: RDBMS 정규화 (2) | 2025.07.07 |
| IT: 데이터 이행 (1) | 2025.05.25 |
| IT: 데이터 클렌징 (0) | 2025.05.25 |
| IT: YAML(YML) (1) | 2025.03.04 |