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

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

相关文章

来自专栏程序员互动联盟

【编程技巧】成为Java技术大牛之25招必杀技

1. 你需要精通面向对象分析与设计(OOA/OOD)、设计模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、inter...

3776
来自专栏Hadoop实操

如何使用Flume准实时建立Solr的全文索引

3942
来自专栏安恒信息

遭JBoss漏洞破坏,23000台服务器“中招”

十月初,安全研究员Andrea MIcalizzi在多家厂商(包括惠普,McAfee,赛门铁克和IBM)使用4.X和5.X JBoss的产品中发现了一个漏洞并将...

3707
来自专栏CreateAMind

commaai代码!

lateral plan : selfdrive.controls.lib.pathplanner longitudal plan: selfdrive.con...

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

一个备库中ORA错误信息的分析 (r6笔记第69天)

最近也在处理一些遗留的问题,所以对于使用orabbix的报警还是心怀敬畏之心,一方面是我们让它能够做全方位的监控,另一方面也让我发现我们还是存在不少的小问题,小...

2615
来自专栏dalaoyang

熔断器---Hystrix

Hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 说到熔断器,先要引入另外一个词,雪崩效应...

2786
来自专栏云计算

基于微服务的 Abixen 平台中的领域驱动设计方法

原文地址:https://dzone.com/articles/ddd-tiers-approach-in-microservices-based-abixen

5945
来自专栏linux驱动个人学习

IPC- Posix与system v

 一、功能上的区别 posix和system v有什么区别/?现在在应用时应用那一标准 浮云484212 | 浏览 243 次 2014-11-06 10:36...

3689
来自专栏子勰随笔

SDK设计心得之错误码

6156
来自专栏Java后端技术栈

三条路线告诉你如何掌握Spring IoC容器的核心原理

前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主...

1003

扫码关注云+社区