본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 30 / 32

SQL 고급활용 및 튜닝 · Lock과 동시성 30 / 32

Lock과 트랜잭션 동시성 제어

여러 사용자가 동시에 데이터를 바꿀 때 필요한 잠금, 트랜잭션 격리, 블로킹과 데드락의 차이를 정리합니다.

출제 빈도 ★★★☆☆ 관련 문제 3개 | LockBlockingDeadlock

왜 Lock이 필요한가

데이터베이스는 여러 사용자가 동시에 접근합니다. 한 사용자가 수정 중인 데이터를 다른 사용자가 동시에 바꾸면 데이터가 깨질 수 있습니다. Lock은 이런 충돌을 막기 위한 장치입니다.

UPDATE account
SET balance = balance - 10000
WHERE account_id = 1;

이 작업이 끝나기 전에 다른 트랜잭션이 같은 계좌 잔액을 동시에 수정하면 결과가 꼬일 수 있습니다. 그래서 DBMS는 필요한 범위에 잠금을 겁니다.

공유 Lock과 배타 Lock

구분의미
공유 Lock읽기 일관성을 위한 잠금
배타 Lock수정 중인 데이터에 대한 잠금

배타 Lock이 걸린 행은 다른 트랜잭션이 동시에 수정하기 어렵습니다. 트랜잭션이 길어질수록 잠금이 오래 유지되어 대기 문제가 커질 수 있습니다.

블로킹과 데드락

블로킹은 한 트랜잭션이 잠금을 잡고 있어 다른 트랜잭션이 기다리는 상태입니다.

T1: A 행 수정 후 커밋 전
T2: A 행 수정 시도 → T1이 끝날 때까지 대기

데드락은 서로가 서로의 잠금을 기다려 더 이상 진행할 수 없는 상태입니다.

T1: A 잠금 보유, B 필요
T2: B 잠금 보유, A 필요

DBMS는 보통 데드락을 감지하면 한쪽 트랜잭션을 취소해 상황을 해소합니다.

트랜잭션 격리 수준

격리 수준은 동시에 실행되는 트랜잭션이 서로의 변경을 얼마나 볼 수 있는지 정합니다.

현상의미
Dirty Read커밋되지 않은 변경을 읽음
Non-repeatable Read같은 행을 다시 읽었을 때 값이 바뀜
Phantom Read같은 조건으로 다시 조회했을 때 행이 늘거나 줄어듦

격리 수준을 높이면 일관성은 강해지지만 동시성은 낮아질 수 있습니다. 반대로 격리 수준을 낮추면 동시성은 좋아질 수 있지만 읽기 이상 현상 가능성이 커집니다.

동시성 문제 줄이는 방법

  • 트랜잭션을 짧게 유지합니다.
  • 사용자 입력을 기다리는 동안 트랜잭션을 열어두지 않습니다.
  • 같은 업무에서는 테이블 접근 순서를 일정하게 맞춥니다.
  • 대량 변경 작업은 업무 시간과 충돌하지 않게 계획합니다.
  • 필요한 행만 정확히 찾도록 조건과 인덱스를 정비합니다.

COMMIT의 의미

COMMIT은 변경을 확정하고 잠금을 해제하는 중요한 지점입니다. 커밋하지 않은 채 오래 두면 다른 사용자의 작업이 기다릴 수 있습니다.

UPDATE emp SET sal = sal + 100 WHERE empno = 7788;
COMMIT;

한 문장 요약

Lock은 데이터를 지키지만 오래 잡으면 동시성을 떨어뜨리므로, 트랜잭션은 짧고 명확해야 합니다.