`

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

sql 
阅读更多
摘要: 崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。在新年前,轻松一点,看看崔华这篇小文,通过一个简单的例子,理解Oracle的自制事务、死锁,建议大家动手去测试、尝试,从而从中学到更多的知识。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1
崔华,网名 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,就会产生自我死锁,如下所示:
640?wx_fmt=png&wxfrom=5&wx_lazy=1
此时alert log里会显示:
ORA-00060: Deadlock detected.
More info in file /u01/app/oracle/admin/ipra/udump/ipra_ora_921828.trc.
从上述trace文件里我们可以看到:
640?wx_fmt=png&wxfrom=5&wx_lazy=1
也就是说这里的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.
原文链接:http://click.aliyun.com/m/26188/
分享到:
评论

相关推荐

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...

    进程线程及死锁

    互斥锁是指一种机制,它可以防止多个进程同时访问同一个共享资源。通过使用互斥锁,我们可以避免死锁的发生,从而提高系统的稳定性。 理解进程、线程和死锁的概念对于操作系统的设计和实现至关重要。同时,POSIX...

    操作系统课件:Lecture9 进程的死锁.ppt

    操作系统中的死锁是一个重要的概念,尤其对于理解和设计高效稳定的系统至关重要。死锁是指在一组进程中,每个进程都等待其他进程释放资源,导致整个系统停滞不前的现象。在"操作系统课件:Lecture9 进程的死锁.ppt...

    计算机硬件与软件:2.2.5 处理机管理_死锁.ppt

    - **环路等待条件**:存在一个进程等待序列,每个进程都在等待序列中下一个进程所占有的资源。 处理死锁的方法主要有预防、避免、检测和解除: 1. **预防死锁**:通过修改系统设计或资源分配策略,防止四个必要...

    进程调度与死锁-作业

    要判断系统是否安全,我们可以使用银行家算法来检查是否存在一个安全序列,即一系列进程可以在不引起死锁的情况下完成它们的任务。如果存在这样的序列,系统就是安全的;如果没有,系统可能陷入死锁状态。在这个具体...

    操作系统:第3章进程调度与死锁1.ppt

    调度准则是指操作系统中用于选择下一个执行进程的规则。常见的调度准则有先来先服务、短作业优先、优先数高者优先等。 3. 调度算法 调度算法是指操作系统中用于选择下一个执行进程的算法。常见的调度算法有先来先...

    sql数据库死锁查询工具

    - 事务回滚:数据库管理系统会自动检测到死锁,并选择一个事务进行回滚以打破死锁。 - 手动干预:管理员可以通过终止特定事务、调整事务的执行顺序或优化SQL语句来避免死锁。 - 设置超时:为事务设置超时限制,超时...

    操作系统,关于进程调度与死锁

    进程调度的主要任务是决定哪个进程可以使用处理机,并在多个进程之间分配处理机资源。 在进程调度中,存在着多种调度算法和机制,例如先来先服务(First-Come-First-Served,FCFS)调度算法、短作业优先(Shortest ...

    操作系统实验三 预防进程死锁的银行家算法

    在多任务并发运行的环境中,死锁是一个严重的问题,它指的是两个或多个进程互相等待对方释放资源而无法继续执行的情况。银行家算法是一种预防进程死锁的经典策略,由艾兹格·迪杰斯特拉提出,主要用于确保系统的安全...

    SQLServler自动杀死死锁进程

    提供的压缩包文件"Sqlserver自动杀死死锁进程sql"很可能包含了一个示例脚本,用于配置SQL Server自动处理死锁。执行这样的脚本通常涉及修改数据库引擎的配置参数,或者创建存储过程来自动检测并解决死锁。 6. **...

    操作系统:第3章进程调度与死锁3.ppt

    操作系统:第3章进程调度与死锁3.ppt

    操作系统第四章进程调度与死锁.ppt

    剥夺方式是当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。 进程调度的性能衡量指标包括响应时间、周转时间、处理机的利用率、截止时间、系统吞吐量、公平等。进程调度...

    3.3.2 进程死锁1

    操作系统中的死锁问题是一个复杂而重要的主题,它涉及到多个进程之间的资源竞争和同步问题。死锁发生时,多个进程在等待对方释放资源,导致它们都无法继续执行,形成一种僵局。以下是关于死锁的一些关键知识点: 1....

    进程管理 2.4死锁1

    **银行家算法**是死锁避免的一种策略,它确保系统始终处于安全状态,即存在一个安全序列,使得每个进程都能顺利完成。算法涉及工作向量、最大需求矩阵、分配矩阵和需求矩阵,通过一系列检查和资源分配,确保系统不会...

    实验二:死锁的检测和预防.doc

    安全序列是一个进程序列{P1,…,Pn},使得对于每一个进程 Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj(j)当前占有资源量之和。 银行家算法是一种死锁检测和预防算法,通过模拟...

    计算机操作系统课件:第4章进程同步与通信-死锁03.ppt

    进程竞争外部设备的死锁例子则展示了当多个进程竞争同一个资源时,可能会导致死锁的产生。 关于死锁的一些结论是:参与死锁的进程最少是两个,参与死锁的进程至少有两个已经占有资源,参与死锁的所有进程都在等待...

    进程同步与死锁实验PPT学习教案.pptx

    + 设有一个T型路口,其中A、B、C、D处各可容纳一辆车,车行方向如图所示,试找出死锁并用有序分配法消除之 + 要求资源编号合理 准备知识: * 了解进程死锁的原理 * 掌握自然有序分配法 实验原理: * 死锁是指...

    如何解决Oracle杀死死锁进程

    5. 查询死锁:使用以下 SQL 语句可以查询死锁: ```sql select t2.username||' '||t2.sid||' '||t2.serial#||' '||t2.logon_time||' '||t3.sql_text from v$locked_object t1,v$session t2,v$sqltext t3 where t1....

Global site tag (gtag.js) - Google Analytics