• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

由于Pragma自主事务过程而检测到死锁

oracle 来源:Vidhan Jadhav 17次浏览

我有下面的过程,它有pragma autonomous_transaction子句。现在,在验证即将到来的业务逻辑之后,将在Java代码中调用此过程。该PROC的执行后,它开始与一些Java的东西…由于Pragma自主事务过程而检测到死锁

create or replace procedure UPDATE_INSTRUMENT 
is 
    pragma autonomous_transaction; 

begin 

    begin 
    update abc 
     set AUTHSTATUS = p_AUTHSTATUS, 
      STATUS  = p_STATUS, 
      USERID  = p_USERID, 
      LASTUPDATED = TO_DATE(p_LASTUPDATED, 'DD/MM/YYYY'), 
      USERDATETIME = TO_DATE(p_USERDATETIME, 'DD/MM/YYYY') 
    where TRANSACNO = p_TRANSACNO; 
    commit; 
    end; 

    begin 
    update xyz 
     set AUTHSTATUS = p_AUTHSTATUS, 
      USERID  = p_USERID, 
      AUTHDATE = TO_DATE(SYSDATE, 'DD/MM/YYYY'), 
      LASTUPDATED = TO_DATE(SYSDATE, 'DD/MM/YYYY'), 
    where TRANSACNO = p_TRANSACNO; 
    commit; 
    end; 

end UPDATE_INSTRUMENT; 

表“XYZ”有三个触发器和出一个1是插入和2都在更新前的事件。

P.N: – 在调用此过程之前,表’xyz’未更新或锁定在任何位置。

我收到下面的错误。

ORA-00060:死锁检测在等待资源

ORA-06512:在 “ADTTRG_xyz”,线路277

ORA-04088:触发的执行期间错误 ‘ADTTRG_xyz’

表abc得到正确更新,但它无法更新表xyz。

请解释为什么会发生这种僵局。


===========解决方案如下:

“死锁是如何发生的。”

死锁发生时,两会同时试图改变公共资源 – 如表或唯一索引 – 以这样的方式既不会话可以在没有其他提交第一次提交。这总是一个应用程序设计缺陷,因为死锁是复杂流程和执行不力的逻辑策略的结果。

这里有一些线索是这种情况。

ORA-06512:在 “ADTTRG_xyz”,线路277

一开始,用几百行代码的触发是一个代码的气味。触发器中有很多代码。看起来这里有竞争的机会。特别是…

表’xyz’有三个触发器和… 2在更新事件之前。

‘xyz’表上有两个BEFORE UPDATE触发器,生成死锁的事件是’xyz’的更新。这可能不是巧合。

您必须调查这两个触发器并确定它们需要哪些表和索引,以便您可以发现它们是否存在争用。

pragma autonomous_transaction;

的PL/SQL documentation说:“如果一个自治事务尝试访问的主要事务持有的资源,可能会发生死锁。“自治事务是另一种代码异味,自治事务的有效用例非常少,更常用于将不良数据模型提交到提交中。

当发生死锁时,Oracle产生一个跟踪文件,这个文件将被写入一个操作系统目录,如果你不知道它在哪里,你可以查询V $ DIAG_INFO视图Find out more。会告诉你两个产生死锁的rowid;你可以使用dbms_rowid.rowid_object()找到对象ID并将其插入到select object_name from all_objects where object_id = :oid;。根据你的组织安排的事情你可能没有访问到tracefile目录,在这种情况下,您需要请求DBA寻求帮助。

一旦您知道哪个表处于死锁状态,您就知道必须在应用程序逻辑中更改哪些内容。这可能是一个相当大的变化,因为你的代码有一些红旗(长触发器体,同一事件上的两个触发器,自治事务)。祝你好运!


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)