2013-05-02 50 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

觸發使應用程序的支持非常困難的,順便說一下,往往表明需要應付去歸一化的設計,這也是一個問題。儘可能避免。