oracle DDL锁超时问题

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,立刻出现该错误

 

oracle DDL锁超时问题_第1张图片

 

 

在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年,因此不会存在上述问题。

 

你可能感兴趣的:(oracle数据库,oracle,锁,超时,数据库,session)