【问题标题】:Resolving deadlock caused by parallel triggers in oracle解决oracle中并行触发导致的死锁
【发布时间】:2013-05-03 16:42:38
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: oracle triggers database-deadlocks


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多