Oracle死锁触发器

时间:2018-08-12 09:51:38

标签: oracle plsql database-trigger

我有一个程序P1。
表T1,T2和TRIGGER TRG1
以下是触发事件:

 add_header 'Access-Control-Allow-Origin' http://127.0.0.1 always;
 add_header 'Access-Control-Allow_Credentials' 'true';
 add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Access-Control-Allow-Origin';
 add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';

我正在调用带有参数的过程。在使用这些参数的过程CREATE OR REPLACE TRIGGER AFTER UPDATE OF RECORD_STATUS ON T1 WHEN (NEW.RECORD_STATUS='U') BEGIN . --Calling Procedure P1(); . END; 中,我正在从T1中选择数据并进行一些验证并将其插入P1中。

成功插入后,我将更新过程中的T2

现在我执行以下语句:

RECORD_STATUS='I'

由于触发事件在这里发生,因此它正在调用我的过程,并且在过程中,因为我正在更新同一列,所以触发器再次被触发并导致死锁。请帮助我。

谢谢。

1 个答案:

答案 0 :(得分:-1)

首先,请务必不要使用触发器,除非您绝望。

如果您已经在存储过程中更新了表,则将逻辑添加到P1过程中,或者创建具有附加功能的第二个过程并从P1中调用它。

良好的公民身份是数据库开发的一部分。这些表上的所有事务都应遵循相同的顺序。使用触发器更新同一张表不是好公民。

如果您确实需要执行此类操作,则可以尝试的一种方法是使用Autonomous Transaction