解决oracle中并行触发器导致的死锁问题

时间:2013-05-02 17:34:42

标签: oracle triggers database-deadlocks

我的朋友问我这个问题而我无法解决。

考虑我在table1上有两个触发器的情况。 两者都是BEFORE INSERT触发器。 这两个触发器都会尝试更新row 1的{​​{1}}。 当INSERT查询在table2上运行时,两个触发器都会尝试更新同一行table1并导致死锁。 这是一个简化的问题。 在实际情况中,大约有50个触发器和一些其他原因,因此我们无法在任何触发器中使用COMMIT。

现在请帮我解决上述问题。

  • 有什么东西我可以对触发器进行排序。
  • 是否可以以任何方式利用保存点来解决此问题。
  • 或者我需要创建临时表并使用它做任何事情。

请解释是否有任何解决方案可行。

2 个答案:

答案 0 :(得分:4)

这是真实情况还是假设情况?据我所知,你只能在一个带有自治事务的触发器中提交,这可以解释死锁,因为否则你在同一个事务中运行触发器代码,并且它不会自行死锁。

无论如何,使用11.2,您可以使用FOLLOWING子句控制触发器的触发顺序:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm#CJADJGIF

顺便说一句,触发器使应用程序支持变得非常困难,并且通常表明需要处理非常规设计,这也是一个问题。尽可能避免。

答案 1 :(得分:1)

同一个表上的触发器以非指定的顺序连续执行(事实上,按其object_id排序)。
在触发器内执行提交是个坏主意 您可以使用全局临时表(在提交删除行上)或包变量来存储临时数据。