DB

공유 락(Shared Lock, S-Lock)과 배타 락(Exclusive Lock, X-Lock)

5linesys 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