ORACLE报“ORA-00054:资源正忙,但指定以 NOWAIT 方式获取资源,或者超时失效”的错误(v$locked_object、v$session、v$lock的使用)
一、错误类型
二、解决异常步骤
1、SELECT SESSION_ID FROM V$LOCKED_OBJECT; --查看被锁对象的ID 2、SELECT SID,SERIAL#,USERNAME,OSUSER FROM V$SESSION WHERE SID=SESSION_ID; --SESSION_ID是第一步查出来会话ID,查出session会话的sid和serial# 3、ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
--对该会话进行终止.SID会被重用,同一个SID被重用时,SERIAL会增加,不会重复,所以结束会话时要指出SID和SERIAL#
三、视图详解
1、v$lock
查看数据库中的锁
select * from v$lock;
--SID:持有锁的会话SID,与v$session相关联
--TYPE:锁的类型。TM表示表锁或DML锁,TX表示行锁或事务锁,UL表示用户锁。
--LMODE:会话保持的锁的模式。0=NONE;1=NULL;2=ROW-S;3=ROW-X;4=SHARE;5=S/ROW-X;6=EXCLUSIVE。
--ID1/ID2:根据TYPE的值而定,主要是TM和TX。TYPE=TM时,ID1=OBJECT_ID,与DBA_OBJECTS相关联,ID2=0
--REQUEST:REQUEST=n,表示该会话正在等待lmode=n的锁
--BLOCK:该会话是否被锁。0=没被锁;1=被锁。
2、v$locked_object
查询数据库中被锁的对象
SELECT * FROM V$LOCKED_OBJECT; --OBJECT_ID:被锁对象ID --SESSION_ID:持有锁的SESSION_ID --ORACLE_USERNAME:持有锁的ORACLE用户名 --OS_USER_NAME:持有锁的系统用户名 --PROCESS:操作系统进程号 --LOCKED_MODE:锁模式
3、v$session
查询数据库中的会话信息
SELECT * FROM V$SESSION; --SADDR:会话地址 --SID:会话ID --SERIAL#:SID会被重用,同一个SID被重用时,SERIAL会增加,不会重复 --PADDR:进程地址,关联V$PROCESS的ADDR字段,关联查出当前session对应操作系统的那个进程的id --USER#:用户名编号 --USERNAME:用户名 --COMMAND:命令类型 --ONERID:所属用户的ID --TADDR:事务地址,关联V$TRANSACTION表的ADDR,关联查出当前session正在使用的回滚段的情况 --LOCKWAIT:等到锁的地址 --STATUS:会话状态 --SERVER:服务器类型。 --PROCESS:操作系统客户机进程ID ....
三、参考链接
1、
2、v$lock参考链接
3、
4、