system kill session “sid,serial#”;或者使用相关操做系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。sql
select t2.username, t2.sid, t2.serial#, t3.object_name, t2.OSUSER, t2.MACHINE, t2.PROGRAM, t2.LOGON_TIME, t2.COMMAND, t2.LOCKWAIT, t2.SADDR, t2.PADDR, t2.TADDR, t2.SQL_ADDRESS, t1.LOCKED_MODE from v$locked_object t1, v$session t2, dba_objects t3 where t1.session_id = t2.sid and t1.object_id = t3.object_id order by t2.logon_time;
上面这条SQL语句用到了Oracle的两个视图和一个表,分别是v$locked_object、v$session、dba_objects
: v$locked_object
视图中记录了全部session中的全部被锁定的对象信息。 v$session
视图记录了全部session的相关信息。 dba_objects
为oracle用户对象及系统对象的集合,经过关联这张表可以获取被锁定对象的详细信息。数据库
说明:
username:oracle用户名
sid:进程号
serial#:序列号
object_name:表名
osuser:操做系统用户名
machine:机器名
program:操做工具
logon_time:登录时间
lockwait:表示当前这张表是否正在等待其余用户解锁这张表
locked_mode:锁表模式(下面详细说明)session
经过第一步查出来的信息找到被锁的表以后执行以下语句解锁该表:oracle
alter system kill session 'sid,seial#';
注意:sid和seial#就是第一步中查询出来的进程号和序列号。工具
eg:解除第一步中表的锁ui
alter system kill session '10,15';
v$locked_object
中的LOCKED_MODE字段表示锁的模式,oracle中锁的模式有以下几种:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其余DML操做,share
5:S/Row-X 共享行独占(SRX):阻止其余事务操做,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusivespa
数字越大锁级别越高, 影响的操做越多。操作系统
1级锁有:Select,有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share
select for update当对话使用for update子串打开一个游标时,全部返回集中的数据行都将处于行级(Row-X)独占式锁定,其余对象只能查询这些数据行,不能进行update、delete或select for update操做。
3级锁有:Insert, Update, Delete, Lock Row Exclusive
没有commit以前插入一样的一条记录会没有反应, 由于后一个3的锁会一直等待上一个3的锁, 咱们必须释放掉上一个才能继续工做。
4级锁有:Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操做, 但DDL(alter,drop等)操做会提示ora-00054错误。
00054, 00000, “resource busy and acquire with NOWAIT specified”
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5级锁有:Lock Share Row Exclusive
具体来说有主外键约束时update / delete … ; 可能会产生4,5的锁。
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusiverest