自相矛盾:一个进程可以自成死锁么?

崔华,网名 dbsnake

Oracle ACE Director,ACOUG 核心专家

编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。在新年前,轻松一点,看看崔华这篇小文,通过一个简单的例子,理解Oracle的自制事务、死锁,建议大家动手去测试、尝试,从而从中学到更多的知识。

有朋友问我:“一个transaction会自我死锁吗?也就是自己锁死了自己”。

很凑巧,半个月前我刚好帮同事处理过这种自我死锁的情况。

我们这里来构造一个自我死锁的例子:

select sid from v$mystat 
where rownum<2;
       SID
———-
       362
SQL> create table t1 (id varchar2(10),
amount number(10));
Table created
SQL> insert into t1 values('cuihua',100); 
1 row inserted 
SQL> commit;
Commit complete
SQL> select * from t1;
ID              AMOUNT
———- ———–
cuihua             100
 
SQL> create procedure p_autonomous is
  2  PRAGMA  AUTONOMOUS_TRANSACTION;
  3  begin
  4  update t1 set amount=102
  5  where id='cuihua';
  6  commit;
  7  end;
  8  /
Procedure created
SQL> create procedure p_test is
  2 begin
  3 update t1 set amount=101 where id='cuihua';
  4 p_autonomous;
  5 commit;
  6  end;
  7  /
 
Procedure created 

现在只要我执行上述存储过程p_test,就会产生自我死锁,如下所示:

此时alert log里会显示:

ORA-00060: Deadlock detected.
 More info in file /u01/app/oracle/admin/ipra/udump/ipra_ora_921828.trc.

从上述trace文件里我们可以看到:

也就是说这里的Blocker是session 362,Waiter也是session 362,典型的自己锁死了自己。

不知道我为什么要这样构造的朋友们看了如下这样一段话就什么都明白了:

The Oracle server provides the ability to temporarily suspend a current transaction and begin another. This second transaction is known as an autonomous transaction and runs independently of its parent. The autonomous or child transaction can commit or rollback as applicable, with the execution of the parent transaction being resumed upon its completion. The parent may then perform further operations and commit or roll back without affecting the outcome of any operations performed within the child. The child transaction does not inherit transaction context (that is, SET TRANSACTION statements). The transactions are organized as a stack: Only the “top” transaction is accessible at any given time. Once completed, the autonomous transaction is “popped” and the calling transaction is again visible. The limit to the number of suspended transactions is governed by the initialization parameter TRANSACTIONS. The Oracle server uses similar functionality internally in recursive transactions. Transactions must be explicitly committed or rolled back or an error ORA-6519 is signaled when attempting to return from the autonomous block. A deadlock situation may occur where a called and calling transaction deadlock; — this is not prevented, but is signaled by an error unique to this situation. The application developer is responsible for avoiding this situation.

近期文章

删繁就简-云和恩墨的一道面试题解析

用SQL解一道数学题:Gauss和Poincare

新年贺礼:云和恩墨大讲堂期刊发行

2015 Oracle 十大热门文章精选

Oracle 12c ASM 防火防盗新特性揭秘

DBA入门之路:学习与进阶之经验谈

DBA入门之路:关于日常工作的建议

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

干货教程:教你DIY一个萌蠢可爱的机器鸟

这个名叫RoboBrrd的鸟形机器人项目来自RobotGrrl,原文发布于Makezine。Makezine对本项目的难度评级为“适中”,制造耗时估计在3-20...

3046
来自专栏直播系统15610367886

方维直播源码搭建,区块链游戏宠物玩法介绍,以太坊数字钱包!

方维直播源码搭建请参考:https://blog.csdn.net/v15610367886

2707
来自专栏机器人网

无人机教程:说说入门那些事

无人机火爆的程度已无需多言。很多朋友或多或少地动过心思,想买一个无人机玩玩,那么,今天我们来说说,要想入门无人机,需要了解及掌握哪些东西呢? 我们将从无人机的...

37212
来自专栏机器人网

【干货】详解自动化机械臂维修&保养

自动化机械手可能会产生故障的原因:由于机械手衔接部位大大都是螺丝固定,可能会因为长时间震动形成螺丝松动松脱而形成机械手散架,部件的衔接块断裂等。另一方面机械手震...

3517
来自专栏Python与爬虫

[资源分享]计算机科学速成课

推荐 程序员的你一定要看,不是程序员的也可以看看,我已经安利刚中考完的我妹妹看了(培养程序媛...)

953
来自专栏机器人网

动图揭秘!身边最平常的机械,它们的工作原理你知道吗?

你一定好奇过自动贩卖机是如何识别硬币的、卷尺是如何把几米长的金属卷起来的?是时候进入他们的内部了,这些原理gif将完美解释你心中的疑问。同时,你会发现这些普通的...

3485
来自专栏计算机视觉与深度学习基础

2014ACM/ICPC亚洲赛上海赛区总结

         翘了中期检查来参赛心中有些害怕,前一天交待好后,12月5日下午来到上海,一行10人有说有笑,宾馆住下,晚上达神请吃饭,一切顺利。       ...

18210
来自专栏racaljk

2018第九届蓝桥杯决赛(C++ B组)

x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 小明有...

1583
来自专栏AI研习社

FPL 2017最佳论文:如何对FPGA云发动DoS攻击?

第27届现场可编程逻辑与应用国际会议(The International Conference on Field-Programmable Logic and ...

34110
来自专栏机器人网

史上最全汽车图解,老司机也未必认得完 (收藏版)

这份史上最全汽车各部件图解,非常值得收藏!就算是老师傅,有很多部件的名字你肯定听说过但不一定都知道在哪个位置吧。 ? 打开发动机盖,就是这个样子了,4A13...

2758

扫码关注云+社区