락과 데드락: 잠금 대기, 데드락 원인과 예방, 잠금 조회
야간 배치를 돌리는 동안 화면의 저장 버튼이 멈추거나, 어느 날 갑자기 "데드락이 감지되었습니다" 오류가 뜹니다. 둘 다 여러 세션이 같은 행을 놓고 겹칠 때 생기는 일입니다. 이 레슨은 잠금 대기가 왜 생기는지, 데드락은 어떤 순환인지, 어떻게 예방하고 어떻게 조회하는지 다룹니다.
1. 왜 배우는가
테스트 서버에서는 한 사람이 쓰니 문제가 없다가, 운영에서 동시 사용자가 늘면 갑자기 느려지는 일이 있습니다. 원인은 SQL 자체보다 세션끼리 서로 기다리는 잠금인 경우가 많습니다. 실행 계획을 아무리 봐도 답이 없고, 누가 누구를 막고 있는지를 조회해야 풀립니다.
실무 06 트랜잭션에서 커밋하지 않은 세션이 잠금을 쥔다고만 짚었습니다. 이 레슨은 그 잠금이 어떻게 대기와 데드락으로 번지는지, 그리고 작업 큐처럼 여러 작업자가 같은 표를 나눠 가질 때 어떻게 피하는지를 다룹니다.
이 레슨은 실무 06 트랜잭션과 중급 09 인덱스를 안다고 보고 진행합니다.
주의잠금 대기와 데드락은 세션이 둘 이상 있어야 생깁니다. H2 스크립트 하나로는 재현할 수 없어서, 두 세션의 흐름은 모두 시간 순서 도식(설명용)이고 DB별 잠금 조회 결과는 도식(H2 미지원, 실행 결과 아님)입니다. 실제로 H2 에서 실행한 것은 한 세션에서 되는 FOR UPDATE 문법, 작업 큐 흐름, 인덱스 조회입니다.