我的朋友问我这个问题而我无法解决。
考虑我在table1
上有两个触发器的情况。
两者都是BEFORE INSERT触发器。
这两个触发器都会尝试更新row 1
的{{1}}。
当INSERT查询在table2
上运行时,两个触发器都会尝试更新同一行table1
并导致死锁。
这是一个简化的问题。
在实际情况中,大约有50个触发器和一些其他原因,因此我们无法在任何触发器中使用COMMIT。
现在请帮我解决上述问题。
请解释是否有任何解决方案可行。
答案 0 :(得分:4)
这是真实情况还是假设情况?据我所知,你只能在一个带有自治事务的触发器中提交,这可以解释死锁,因为否则你在同一个事务中运行触发器代码,并且它不会自行死锁。
无论如何,使用11.2,您可以使用FOLLOWING子句控制触发器的触发顺序:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm#CJADJGIF
顺便说一句,触发器使应用程序支持变得非常困难,并且通常表明需要处理非常规设计,这也是一个问题。尽可能避免。
答案 1 :(得分:1)
同一个表上的触发器以非指定的顺序连续执行(事实上,按其object_id排序)。
在触发器内执行提交是个坏主意
您可以使用全局临时表(在提交删除行上)或包变量来存储临时数据。