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

崔华,网名 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 条评论
登录 后参与评论

相关文章

来自专栏ACM算法日常

PAT-CCCC练习:L2-020.功夫传人(并查集)

题目:https://www.patest.cn/contests/gplt/L2-020

922
来自专栏tkokof 的技术,小趣及杂念

关于Unity ParticleSystem的一些"冷"知识

  目前的游戏开发中,粒子系统的使用想必是标配了,Unity自然也提供了相应的解决方案:ParticleSystem,网上对ParticleSystem的介绍也...

401
来自专栏绿巨人专栏

读书笔记: 博弈论导论 - 06 - 完整信息的静态博弈 混合的策略

3437
来自专栏C语言及其他语言

[每日一题]恺撒密码(1214)

这是一个关于凯撒的悲伤的故事。。。。。。 题目描述 恺撒生活在充满危险和阴谋的时代. 恺撒面对的最困难的问题是生存. 为了生存, 他决定创造一种密码. 这种...

2565
来自专栏炉边夜话

利用Oprofile对多核多线程进行性能分析

在对应用程序不断调优的过程中,除了制定完备的测试基准(Benchmark)外,还需要一把直中要害的利器——性能分析工具。

512
来自专栏杨建荣的学习笔记

海量数据迁移之通过shell估算数据量 (r2笔记93天)

在数据迁移的时候,需要根据用户量来评估需要在表空间理添加的空间大小。比如迁移5百万的用户和迁移200万,两者需要添加的数据量差别很大,在资源有限的情况下,需要一...

2352
来自专栏工科狗和生物喵

【计算机本科补全计划】CCF计算机职业资格认证 2016-09-03(炉石传说)详解

正文之前 这是2016年九月份的CCF考试的第三题,按照高分标准来算,应该是在30min内解决??然而。我昨晚花了10mins看完了题目,今天上午有限元课的时候...

3595
来自专栏数据和云

神马?SQL竟然可以解脑筋急转弯的题目?

我在很多公开演讲中都明目张胆的羡慕过一类人,他们把SQL当做艺术,把旁人眼中的枯燥演绎成经典,云和恩墨专家团队中的杨廷琨、罗海雄就都是这样的SQL专家。 今天,...

3084
来自专栏ml

HDUOJ----2159 FATE

FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java...

2596
来自专栏数据和云

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

杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 用SQL为解析一道数学题 ---- Ora...

3465

扫描关注云+社区