-
공유 락(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. 공유 락(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;
- 재고 수정 시 동시 접근 차단
- 재고 수량 정확성 보장
- 초과 출고 방지
주의사항:
- 락의 범위를 최소화하여 성능 저하 방지
- 데드락 발생 가능성 고려
- 트랜잭션 처리 시간 최소화
- 적절한 락 타입 선택으로 동시성 최적화
예제를 위한 간단한 테스트를 진행한 코드는 아래 링크에서 확인 가능
https://github.com/O-Seonsik/lock-test/tree/master/src/modules/products
'DB' 카테고리의 다른 글
낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock) (0) 2024.11.14 DB - 블로킹(Blocking)과 데드 락(Deadlock) (0) 2024.11.11 Isolation level - 트랜잭션 격리 수준 (0) 2024.09.22