Oracle LOCK内部机制及最佳实践系列(五)给出一个导致死锁的SQL示例51CTO博客 - 娱乐之横扫全球

Oracle LOCK内部机制及最佳实践系列(五)给出一个导致死锁的SQL示例51CTO博客

2019年03月10日08时45分45秒 | 作者: 白萱 | 标签: 死锁,一个,会话 | 浏览: 2814

给出一个导致死锁的SQL示例

死锁界说:从广义上讲包含操作系统 应用程序 数据库,假如2个进程(会话)彼此持有对方的资源,都一向等候对方开释,这种状况会形成死锁。
误解:会话的堵塞可不是死锁,由于其中有一个会话仍是可以持续操作的。
开释:Oracle会自动检测死锁并强制干涉开释

LEO1@LEO1> create table p1 ( x int primary key );       咱们新建一个p1表,设置x字段为主键
Table created.
LEO1@LEO1> insert into leo1.p1 values(10);                 138会话刺进的是10
1 row created.
LEO2@LEO1> insert into leo1.p1 values(20);                 156会话刺进的是20
1 row created.
LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in (TM,TX) order by 1,2;
       SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

       138 TM              73470          0          3          0          0
       138 TX             327713    1124          6          0          0             138有一个TX排他锁,但当时没有堵塞会话
       156 TM              73470          0          3          0          0
       156 TX             589825      945          6          0          0             156也有一个TX排他锁,但当时也没有堵塞会话
LEO1@LEO1> select object_name from dba_objects where object_id=73470;            看p1表上存在正常的TM  TX锁,都没有堵塞到对方的会话
OBJECT_NAME

P1
LEO1@LEO1> insert into leo1.p1 values(20);              此刻我在138会话上再刺进20,发现hang住了不能行进,这是什么原因呢?咱们看看v$lock视图
LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in (TM,TX) order by 1,2;
       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

       138 TM      73470          0          3          0          0
       138 TX     589825      945          0          4          0     这时138会话就持续刺进了,但这个刺进动作是成功的没有堵塞,而是由于138|156会话修正值的相同
       138 TX     327713    1124          6          0          0     违反了主键束缚然后发生堵塞,实践是对修正值的相同发生了堵塞,所以请求的是4级锁,而非6级锁
       156 TM      73470          0          3          0          0
       156 TX     589825      945          6          0          1     156会话此刻正在堵塞138会话,由于156会话的业务还没有完结仍是一个未决状况

LEO2@LEO1> insert into leo1.p1 values(10);               我在156会话上也刺进10,这时死锁的效果就出来了
LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in (TM,TX) order by 1,2;
       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

       138 TM      73470          0          3          0          0
       138 TX     327713    1124          6          0          1     138会话此刻正在堵塞156会话,由于138会话的业务还没有完结仍是一个未决状况
       156 TM      73470          0          3          0          0
       156 TX     327713    1124          0          4          0     实践上是对修正值的相同发生了堵塞,156会话正在请求4级锁
       156 TX     589825      945          6          0          0
LEO1@LEO1> insert into leo1.p1 values(20);               咱们看一下138会话报错,Oracle自动检测死锁并强制干涉开释
insert into leo1.p1 values(20)
                 *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource(等候资源时检测到死锁->开释之)  这时请注意一下,仅仅开释掉了第一个确定,但第二个确定还在等候,所以咱们要手艺开释

小结:上面讲到了好几种锁的机制,咱们崇尚的思维就是先要想一想为什么会呈现锁,不呈现行不可,锁的效果有哪些,这种启发式的思路可以让咱们回忆深入。
LOCK效果:独占业务资源  确保读一致性  保护业务完整性
LOCK主旨:没有并发就没有锁,一个人操作数据库是不会发生锁的


Leonarding
2012.11.28
天津&winter
共享技能~成果愿望

Blogwww.leonarding.com
 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章