Oracle数据库死锁的一些通用操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经常碰到Oracle数据库死锁,原因很多,大部分情况下都需要用到的操作主要有以下几个方面:1、查找死锁。当发现死锁时,必须要知道死锁的情况和发生死锁的根源。

1)查看是否有死锁:

select object_id,session_id,locked_mode from v$locked_object;

2)查看死锁的用户和进程:

select ername,t2.sid,t2.serial#,t2.logon_timefrom v$locked_object t1,v$session

t2where t1.session_id=t2.sidorder by t2.logon_time;

3)查看死锁的对象:

select t1.object_name,t2.session_id,t2.locked_modefrom dba_objects

t1,v$locked_object t2where t1.object_id=t2.object_id;

或者

select t3.object_name,T3.object_type,ername,t2.sid,t2.serial#,t2.logon_timefrom dba_objects t3,v$locked_object t1,v$session t2where t1.session_id=t2.sidand

t3.object_id=t1.object_id order by t2.logon_time;

4)查看死锁发生的sql语句:

select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object));

2、删除死锁:

(1).先杀Oracle进程:

ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

(2).再杀操作系统进程:

KILL -9 刚才查出的SPID

3、ORACLE里锁有以下几种模式:

0:none

1:null 空

2:Row-S 行共享(RS):共享表锁

3:Row-X 行专用(RX):用于行的修改

4:Share 共享锁(S):阻止其他DML操作

5:S/Row-X 共享行专用(SRX):阻止其他事务操作

6:exclusive 专用(X):独立访问使用

数字越大锁级别越高, 影响的操作越多。

4、一些基础判断

∙一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。

select ... from ... for update; 是2的锁。

∙当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或

select...for update操作。

∙insert / update / delete ... ; 是3的锁。

∙没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

∙创建索引的时候也会产生3,4级别的锁。

∙ locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。

∙有主外键约束时update / delete ... ; 可能会产生4,5的锁。

∙DDL语句时是6的锁。

相关文档
最新文档