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