FAQ
LOCK TIMEOUT 발생 시 조치 방법
분류 운영/관리 등록일 2013-07-09 조회수 5896
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.

위의 오류코드 내용과 같이 해당 객체 - 테이블이나 뷰, 저장 프로시져 등 - 에 대해
lock을 잡을 수가 없다는 오류입니다.

테이블에 접근하는 모든 세션은 해당 테이블에 락을 잡고 접근하게 됩니다.
그러니까 그 테이블에 SELECT/INSERT/UPDATE 등의 DML을 수행하거나 ALTER TABLE 등의 DDL을 수행하는 등의
작업을 누군가 하고 있을 때 DROP TABLE을 수행하면 이전 작업이 commit/rollback할 때 까지 기다리게 됩니다.

이 경우, 사용자가 없는지 확인하고 이전 작업이 commit할 때가지 기다리거나,
세션을 강제로 끊을 수 있습니다.
하단의 예와 같이 alter database 문을 사용하면 세션을 강제로 끊을 수 있습니다.
alter database 명령어로 session을 종료해도 해당 세션외의 다른 부분에는 영향을 미치지 않습니다.
그러나 서비스 중인 시스템에서 session id를 잘못 알고 session을 종료했을 경우,
문제가 될 수 있습니다.

운영을 위한 참고사항으로, 서비스 중인 시스템일 경우,
접속된 세션을 끊어도 또 다른 application이 접속하여 해당 테이블에 접근하면
lock이 추가될 수 있으므로 이부분에 대한 고려도 필요합니다.
가능하다면 작업중에는 해당 application이 실행되지 않도록 하는 것이 좋습니다.

=========================================================
[ lock 정보 확인 ]

select T.table_name, X.lock_desc
from system_.sys_tables_ T, v$lock X
where T.table_oid = X.table_oid
and T.table_name = 'T1';

=========================================================
[ 세션 강제 종료 방법 ]

[1] SESSION ID 찾기
iSQL> select 'alter database mydb session close '||ses_id||'; '
from
(
select
T.table_name, SES.id ses_id,
X.lock_desc, X.lock_cnt, x.TRANS_ID,
SES.client_pid pid, SES.COMM_NAME,
STM.query qry
from
v$session SES, v$statement STM,
v$lock X, system_.sys_tables_ T
where
SES.id = STM.session_id
and STM.tx_id = X.trans_id
and X.table_oid= T.table_oid
-- and T.table_name like 'TEST1%' -- 원하는 테이블을 명시하십시오.
)
group by ss_id ;
'alter database mydb session close '||SS -- 이렇게 결과가 나옵니다.
------------------------------------------------------------
alter database mydb session close 159;
alter database mydb session close 160;
alter database mydb session close 161;
alter database mydb session close 162;
4 rows selected.

[2] 세션 종료시키기
$ isql -sysdba -u sys -p manager
iSQL(sysdba)>
alter database mydb session close 159;
alter database mydb session close 160;
alter database mydb session close 161;
alter database mydb session close 162; -- 위의 SQL 결과를 copy/paste 해서 실행합니다.
목록