2013-05-02 101 views
0

我的朋友问我这个问题,我无法解决它。解决oracle中由并行触发造成的死锁

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

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

  • 有什么我可以按顺序的触发器。
  • 是否有可能以任何方式利用保存点来解决此问题。
  • 或者我需要创建一个临时表的任何方式,并用它做一些事情。

请说明是否有解决方案是可行的。

回答

1

同一张表上的触发器以非指定的顺序依次执行(实际上是按照它们的object_id排序)。
在触发器内执行提交是个坏主意。
您可以使用全局临时表(在提交删除行上)或程序包变量来存储临时数据。

4

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

反正11.2您以下条款控制触发器的触发顺序:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm#CJADJGIF

触发使应用程序的支持非常困难的,顺便说一下,往往表明需要应付去归一化的设计,这也是一个问题。尽可能避免。