oracle数据库在执行truncate table的时候报错: ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired
该问题原因是oracle在执行DDL操作时,DML操作已经对该对象加锁,由于DDL获取锁超时导致的。
模拟场景:
1.在session1中首先向一个表插入一条记录,但是没有提交
SQL> insert into yc_hs_0001(occur_time_utc, occur_time, cur_01, sta_01)
2 values(to_date('2015-01-01', 'yyyy-mm-dd'), to_date('2015-01-01', 'yyyy-mm-
dd'), 3.4, 1);
1 row created.
2. 另外打开一个会话session 2,执行truncate table,立刻出现该错误
在oracle11g 之后,可以根据命令看到ddl锁的等待时间是0,因此一旦检测到有DML锁,立刻抛出错误
SQL> show parameter ddl_lock_timeout;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout integer 0
3. 在session2修改会话参数等待时间为100秒,执行truncate table,该操作会等待:
SQL> alter session set ddl_lock_timeout = 100;
Session altered
SQL> truncate table yc_hs_0001;
4. 在session 1中执行commit操作;
SQL> insert into yc_hs_0001(occur_time_utc, occur_time, cur_01, sta_01)
2 values(to_date('2015-01-01', 'yyyy-mm-dd'), to_date('2015-01-01', 'yyyy-mm-
dd'), 3.4, 1);
1 row created.
SQL> commit;
Commit complete.
5. session 2中的truncate table正确结束
SQL> alter session set ddl_lock_timeout = 100;
Session altered
SQL> truncate table yc_hs_0001;
Table truncated
在Mysql数据库中,DDL操作会占用元数据锁。由于mysql中元数据所缺省时间是1年,因此不会存在上述问题。