0

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

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

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

  • 有什么东西可以让我对触发器进行排序。
  • 是否可以以任何方式利用保存点来解决此问题。
  • 或者我需要创建一个临时表并对其进行处理的任何方式。

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

4

2 回答 2

4

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

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

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

于 2013-05-02T18:17:28.450 回答
1

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

于 2013-05-02T17:47:48.517 回答