我有一个程序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'
由于触发事件在这里发生,因此它正在调用我的过程,并且在过程中,因为我正在更新同一列,所以触发器再次被触发并导致死锁。请帮助我。
谢谢。
答案 0 :(得分:-1)
首先,请务必不要使用触发器,除非您绝望。
如果您已经在存储过程中更新了表,则将逻辑添加到P1过程中,或者创建具有附加功能的第二个过程并从P1中调用它。
良好的公民身份是数据库开发的一部分。这些表上的所有事务都应遵循相同的顺序。使用触发器更新同一张表不是好公民。
如果您确实需要执行此类操作,则可以尝试的一种方法是使用Autonomous Transaction