oracle DDL锁超时问题

本文探讨了Oracle数据库中执行TRUNCATE TABLE时遇到ORA-00054错误的原因及解决办法,通过调整会话参数DDL_LOCK_TIMEOUT来避免DDL操作因等待DML锁而超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值