현상
서비스 운영 중 alter 문 수행 시, ‘JDBC-12033:Lock acquisition failed in NOWAIT mode’ 에러가 발생합니다.
원인
DDL 수행 시 DML X lock 적용 안되는 경우 JDBC-12033 에러가 발생하며 wait를 진행하지 않습니다.
해결
Table에 대한 lock을 설정해 alter문을 수행하도록 합니다.
참고
현재 상황에서는 먼저 lock 적용 트랜잭션이 대기 중인 것으로 보이므로
blocking 해소를 위해 commit/rollback 가이드를 제공합니다.
Session 1 | Session 2 |
create table test01 (id number); | |
insert into test01 values (1); | Lock table test01 in exclusive mode wait 10;
→ insert가 commit 되기 전까지 10초간 wait.
10초가 지나면 time out으로 lock 설정안되고 ‘12034’
에러 발생
(TBR-12034: Lock acquisition timed out in WAIT mode.)
→ 다른 세션이 table lock 설정되어 있으면 Lock획득불가 |
commit; | |
Locked. | |
SQL> alter table test01 add id2 number;
Table 'TEST01' altered.
→ DDL의 경우, 자동으로 commit 되므로 별도의 commit 수행 불필요 | |
SQL> commit;
Commit completed. | |
SQL> insert into test01 values (2, 1)
1 row inserted. | |
SQL> commit;
Commit completed.
| |
SQL> select * from test01;
ID ID2
1
2 1
2 rows selected.
| |
Lock 설정된 session이 끊어지면 Lock도 자동 해제 |