由于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