在执行数据库DDL操作 时,有事会出现“Oracle 报 “ORA-00054 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效” 的问题。

1 原因
一般在用户修改记录之前,悲观锁就会发生作用,比如更新语句:

select ..for update,因为我在plsql端修改数据,执行了select * from xxx for update,引发了这个问题。
1
执行这条命令之后,oracle 将会对返回集中的数据建立行级封锁,以防止其他用户修改这些记录。

这时如果对这张表进行 ddl 操作将就会报 ORA-00054 错误。

一张表如果加了表级锁,那么就不允许对该表进行任何的 ddl 操作,否则也会报 ora-00054 错误。

truncate table hbhe.t1;
truncate table hbhe.t1
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired


Elapsed: 00:00:00.00

查看具体哪张表被锁住
select l.session_id,o.owner,o.object_name
from v$locked_object l,dba_objects o where l.object_id=o.object_id;

SESSION_ID OWNER OBJECT_NAME
---------- ---------------------------------------
396 HBHE T1

Elapsed: 00:00:00.06

查看哪个SID,serial
select s.username,s.sid,s.serial#,s.logon_time
from v$locked_object l,v$session s
where l.session_id=s.sid order by s.logon_time;

USERNAME SID SERIAL# LOGON_TI
-------------- ---------- ---------- --------
HBHE 396 26070 19:18:38

hbhe@ORCL 13:38:57> alter system kill session '396,26070';

System altered.

Elapsed: 00:00:00.02
hbhe@ORCL 13:39:44> commit;

Commit complete