6. 정리
행을 수정하면 커밋이나 롤백까지 그 행에 쓰기 잠금이 유지되고, 같은 행을 수정하려는 다른 세션은 기다립니다. Oracle 과 MySQL InnoDB 는 읽기가 잠금을 걸지 않고, MSSQL 기본 READ COMMITTED 는 읽기도 공유 잠금을 잡아 쓰기와 서로 기다릴 수 있습니다(READ_COMMITTED_SNAPSHOT 이면 아님).
대기 한도는 MySQL 이 50 초(오류 1205), Oracle·MSSQL 은 기본 무한이고 NOWAIT·WAIT n·LOCK_TIMEOUT 으로 조절합니다. 행 잠금은 Oracle 이 에스컬레이션하지 않고, MySQL 은 인덱스 레코드에 걸리며 REPEATABLE READ 범위 조건에 갭 잠금이 추가됩니다. MSSQL 은 약 5,000 개 잠금에서 표 잠금으로 에스컬레이션합니다.
데드락은 두 트랜잭션이 서로 상대가 잡은 자원을 기다리는 순환이고, DB 가 감지해 한쪽을 오류로 끊습니다. Oracle ORA-00060 은 문장만 롤백하고 트랜잭션이 남으며, MySQL 1213 과 MSSQL 1205 는 트랜잭션 전체를 롤백합니다. 애플리케이션은 오류를 잡아 롤백하고 다시 시도합니다.
예방은 같은 순서로 갱신, 짧은 트랜잭션, 조건·외래 키 컬럼 인덱스, 입력 대기 중 트랜잭션 열지 않기입니다. 작업 큐는 FOR UPDATE SKIP LOCKED(Oracle·MySQL 8.0)나 MSSQL 의 WITH (UPDLOCK, READPAST)로 작업자끼리 겹치지 않게 나눠 가집니다.
잠금 조회는 Oracle V$SESSION 의 BLOCKING_SESSION, MySQL sys.innodb_lock_waits, MSSQL sys.dm_exec_requests 의 blocking_session_id 입니다.
다음 레슨은 대용량 삭제와 아카이빙으로, 오래된 데이터를 안전하게 지우고 보관하는 방법을 다룹니다.