ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 공유 락(Shared Lock, S-Lock)과 배타 락(Exclusive Lock, X-Lock)
    DB 2024. 11. 10. 01:53
    • 1. 공유 락(Shared Lock, S-Lock)
    • 읽기 작업(SELECT)을 위한 잠금
    • 여러 트랜잭션이 동시에 같은 데이터에 대해 공유락을 획득할 수 있음
    • 데이터를 읽을 수는 있지만 수정은 불가능
    • 다른 트랜잭션의 공유락과 호환되지만, 배타락과는 호환되지 않음

    사용 예시

    SELECT * FROM employees WHERE id = 1 LOCK IN SHARE MODE;

    2. 배타 락(Exclusive Lock, X-Lock)

    • 쓰기 작업(INSERT, UPDATE, DELETE)을 위한 잠금
    • 하나의 트랜잭션만 획득 가능
    • 데이터 읽기와 수정 모두 가능
    • 다른 트랜잭션의 공유락, 배타락 모두와 호환되지 않음

    사용 예시

    SELECT * FROM employees WHERE id = 1 FOR UPDATE;

    락 호환성 매트릭스

      공유 락 배타 락
    공유 락 허용 대기
    배타 락 대기 대기

    이러한 락 시스템을 통해 얻을 수 있는 장점

    1. 데이터 일관성 보장
    2. 동시성 제어
    3. 트랜잭션 격리성 확보

    실제 사용 상황에 대한 구체적인 예시

    1. 공유 락(Shared Lock) 사용 예시

        A. 온라인 쇼핑몰의 상품 재고 조회

    -- 여러 사용자가 동시에 상품 재고를 조회할 때
    SELECT stock_quantity 
    FROM products 
    WHERE product_id = 123 
    LOCK IN SHARE MODE;

     

    • 여러 고객이 동시에 같은 상품의 재고를 조회할 수 있음
    • 재고 수정은 불가능하여 데이터 정확성 보장
    • 실시간 재고 현황 파악 가능

        B. 항공권 예약 시스템의 좌석 조회

    -- 여러 사용자가 동시에 좌석 현황을 조회할 때
    SELECT seat_status 
    FROM flight_seats 
    WHERE flight_id = 'KE607' 
    LOCK IN SHARE MODE;
    • 다수의 사용자가 동시에 좌석 배치도 확인 가능
    • 조회중 다른 사용자의 예약 차단

     

    2. 배타 락(Exclusive Lock) 사용 예시

        A. 은행 계좌 이체

    -- 계좌 잔액 수정 시
    BEGIN TRANSACTION;
    SELECT balance 
    FROM accounts 
    WHERE account_id = 1234 
    FOR UPDATE;
    
    UPDATE accounts 
    SET balance = balance - 50000 
    WHERE account_id = 1234;
    COMMIT;
    • 이체 중 다른 트랜잭션의 접근 차단
    • 동시 이체로 인한  잔액 불일치 방지
    • 데이터 정합성 보장

        B. 온라인 티켓 예매

    -- 좌석 예약 시
    BEGIN TRANSACTION;
    SELECT seat_status 
    FROM concert_seats 
    WHERE concert_id = 789 AND seat_number = 'A-15' 
    FOR UPDATE;
    
    UPDATE concert_seats 
    SET status = 'RESERVED', 
        customer_id = 5678 
    WHERE concert_id = 789 AND seat_number = 'A-15';
    COMMIT;
    • 동시 예매로 인한 중복 예약 방지
    • 예매 진행 중 다른 사용자의 접근 차단

        C. 재고 관리 시스템

    -- 상품 출고 처리 시
    BEGIN TRANSACTION;
    SELECT quantity 
    FROM inventory 
    WHERE product_id = 456 
    FOR UPDATE;
    
    UPDATE inventory 
    SET quantity = quantity - 1 
    WHERE product_id = 456;
    COMMIT;
    • 재고 수정 시 동시 접근 차단
    • 재고 수량 정확성 보장
    • 초과 출고 방지

    주의사항:

    1. 락의 범위를 최소화하여 성능 저하 방지
    2. 데드락 발생 가능성 고려
    3. 트랜잭션 처리 시간 최소화
    4. 적절한 락 타입 선택으로 동시성 최적화

     

    예제를 위한 간단한 테스트를 진행한 코드는 아래 링크에서 확인 가능

    https://github.com/O-Seonsik/lock-test/tree/master/src/modules/products

Designed by Tistory.