oracle DDL锁超时问题

2018-01-24 10:33:34来源:网络收集作者:管理员人点击

分享

[var1]

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锁超时问题


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



相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台