2016-10-10 57 views
0

我在Oracle數據庫中有幾個存儲過程作爲第三方API,我想在一個事務中鏈接這些API調用。我可以做嗎? 據我所知,從that answer我可以使用保存點。但是,如果這些API已經有提交語句,它會起作用嗎? Oracle會回滾嵌套提交嗎?Oracle中的交易

另外,Oracle如何處理保存點和併發? 也就是說如果我們有圖表:

connection#1 (my api call)    connection#2 (3rd party api call) 
savepoint sp1; 
             savepoint sp2; 
update t1 where id=1 set val=1;   update t1 where id=2 set val=2; 
             commit; --done 
call bad_stored_proc(); 
rollback to sp1; 

這裏會發生什麼?回滾只會影響行(id = 1,val = 1)還是兩行?

+0

你不能回滾什麼已經提交。所以在這種情況下,調用的順序很重要,你想要回滾到什麼程度。顯然,你將無法回滾供應商SP的承諾工作。所以你必須專注於你自己的代碼。您的代碼是否依賴於供應商的Sp執行結果?它按順序進行呼叫。它是首先/最後還是在對供應商SP的呼叫中間?說過你可以避免調用供應商的sps,或者在你回滾之後不可避免地清理它們(應該非常小心,取決於那些SP做什麼)。 –

+1

如果他們(供應商的SP)承諾,它可能是一個「bug」或供應商有一個非常引人注意的需要,所以你需要非常小心清理後,如果你選擇這樣做。 –

回答

1

Oracle不會回滾嵌套提交。他們承諾。

你能做的最好的(這不是真的那麼大)會來包裝第三方API的程序和標記與PRAGMA AUTONOMOUS_TRANSACTION該程序。這會限制第三方API只提交自己的工作。這意味着,如果你回滾,第三方交易工作將會承諾,但你做的任何其他工作都不會。

這通常是一個非常糟糕的事情,因爲它會讓你的數據在絕大多數的情況下設計的邏輯損壞。我在不太可能的情況下提到它面臨着可以避開它的設計情況。

1

如果第三方程序調用過程中提交,沒有辦法來運行所有的人都爲一個交易,而無需修改程序本身。

Oracle不支持嵌套提交或嵌套事務。 Commit意味着 - 你正在致力於將更改寫入數據庫,並且失去了回滾更改的選項。

您可以使用一個會話參數檢查第三方程序是否包含任何提交語句。

alter session disable commit in procedure; 

有了這一套,企圖犯任何程序都會拋出一個錯誤消息。*

  • 與感謝馬修·麥克皮克糾正我的這個參數做什麼誤解。