공부, 기록

[SQL Server] 임시 테이블을 사용한 트랜잭션 롤백 실패 본문

공부/DATABASE

[SQL Server] 임시 테이블을 사용한 트랜잭션 롤백 실패

무는빼주세요 2023. 2. 5. 14:28

새벽에 일어나는 작업 중 임시 테이블을 생성하고 해당 테이블과 서비스 테이블을 조인하여 Seq (Identitiy 값인 PK)를 조건으로 데이터를 삭제하는 내용이 있었다.

어떠한 사유로 해당 작업이 새벽에 진행 중 STOP이 되었고 이를 오전 중 다시 실행하고자 하였다.

삭제 중 Key 기반으로 Lock이 잡혔어야 할 데이터가 Lock 에스컬레이션이 발생하였는지 테이블에 Lock 이 걸렸고 일단 서비스 데이터가 인입되어야 하는 테이블이므로 삭제 작업을 중지하도록 하였다.

롤백이 어느정도 진행되고 금방 중단이 될 것으로 판단했으나 시간이 꽤 지나도 롤백이 완료가 되지 않았고

KILL SESSIONID WITH STATUSONLY 를 통하여 확인하였으나 롤백 진행이 0%에 멈춰있었다. 해당 세션을 죽이기 위해서 여러 엮여있는 세션 동시 KILL, 해당 배치가 실행하는 SP RENAME 및 DROP 을 통한 상태 변경, 사용하는 TEMP 테이블을 찾아 TABLE DROP 시도 등등 하였으나 세션은 죽지 않았다.
해당 세션이 CPU, DISKIO 지표는 증가하지만 결과적으로 임시 테이블을 사용하는 과정에서 생기는 롤백 미처리 현상으로 파악하고 서버 재실행을 하면 TEMPDB의 경우 비워지기 때문에 롤백을 하지 않을 것으로 판단하여 서버 재실행을 시도. 정상적으로 서버는 올라왔고 해당 세션은 죽어있는 것 확인. 해당 내용의 경우 DB 버그로 판단되며 서비스팩 업데이트를 통하여 해결 할 수 있다는 구글링 결과가 있지만 업데이트 이후에도 해당 버그가 발견된다는 글 또한 확인이 됨.