개요
SQL 실행 도중 다음과 같이 오류가 나서 원하는 작업을 못할 때가 있습니다.
The transaction exceeds lock timeout specified by user
$ altierr -w "lock timeout"
0x11075 ( 69749) smERR_ABORT_smcExceedLockTimeWait The transaction exceeds lock timeout specified by user.
# *Cause: The transaction failed to lock the object.
# *Action: Please abort the transaction.
버전
ALTIBASE HDB 4 이상
발생원인
SQL 실행 도중 다음과 같이 오류가 나서 원하는 작업을 못할 때가 있습니다
위의 오류코드 내용과 같이 해당 객체 - 테이블이나 뷰, 저장 프로시져 등 - 에 대해 lock을 잡을 수가 없다는 오류입니다.
테이블에 접근하는 모든 세션은 해당 테이블에 LOCK을 잡고 접근하게 됩니다.
즉 그 테이블에 SELECT/INSERT/UPDATE 등의 DML을 수행하거나 ALTER TABLE 등의 DDL을 수행하는 등의
작업을 누군가 하고 있을 때 DROP TABLE을 수행하면 이전 작업이 commit/rollback할 때 까지 기다리게 됩니다.
이 경우, 사용자가 없는지 확인하고 이전 작업이 commit할 때가지 기다리거나, 세션을 강제로 끊을 수 있습니다.
아래 예와(조치방법) 같이 alter database 문을 사용하면 세션을 강제로 끊을 수 있습니다.
조치방법
* lock 정보 확인
* 세션 강제 종료 방법
1. SESSION ID 찾기
2. 세션 종료시키기
참고
alter database 명령어로 session을 종료해도 해당 세션외의 다른 부분에는 영향을 미치지 않습니다.
그러나 서비스 중인 시스템에서 session id를 잘못 알고 session을 종료했을 경우, 문제가 될 수 있습니다.
운영을 위한 참고사항으로, 서비스 중인 시스템일 경우, 접속된 세션을 끊어도 또 다른 application이 접속하여 해당 테이블에 접근하면 lock이 추가될 수 있으므로 이부분에 대한 고려도 필요합니다.
가능하다면 작업중에는 해당 application이 실행되지 않도록 하는 것이 좋습니다.