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

我有下面的过程,它有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寻求帮助。

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

以上是 由于Pragma自主事务过程而检测到死锁 的全部内容, 来源链接: utcz.com/qa/260825.html

回到顶部