IT 여러가지

IT: 비관적 락과 낙관적 락

dewstream 2025. 1. 23. 08:00
728x90

※ 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)
데이터 변경 여부 확인 후 충돌 감지
충돌 처리 충돌 자체를 방지 충돌 감지 후 롤백 및 재시도
데드락 가능성 높음 없음
성능 동시성 저하 동시성 높음
트랜잭션 길이 트랜잭션이 길수록 성능 저하 트랜잭션 길이와 무관
적합한 환경 충돌 가능성이 높은 환경 충돌 가능성이 낮은 환

오늘은 여기까지~

다음 포스팅도 기대해주세요 :)

 

728x90

'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