2010-03-05 83 views
3

我有兩個PL/SQL存儲過程,每個都處理自己的事務(在出錯時開始/提交和回滾)。從.Net代碼我調用這兩個SP如下所示。TransactionScope和存儲過程?

using (TransactionScope ts = new TransactionScope()) 
    { 
      CallSP1(); 
      CallSP2(). 
      ts.SetComplete(); 
    } 

如果我的SP2調用失敗,它會回滾由CallSP1()所做的更改嗎?如果它不回滾,那麼這是否意味着它更好地處理來自.Net應用程序而不是內部存儲過程的事務?

回答

10

如果第一個存儲過程SP1發出提交,那麼它所做的任何更改都將是永久性的。在這種情況下,如果SP2失敗,SP1所做的更改將不會回滾。

IMO調用應用程序應該是處理事務邏輯的應用程序,即不要在您的PL/SQL過程中發出提交或回滾。讓錯誤傳播到調用應用程序,這樣PL/SQL引擎將只回滾由失敗過程完成的工作,而不是整個事務。

讓調用應用程序決定在發生錯誤時應該怎麼做(重試,提交半工作或回滾)。

+2

+1。沒有過程應該提交 - 它只應該保存點/回滾 - 除非它是最終的調用者;程序中的主要{}。 – 2010-03-05 21:05:16

2

如果SP1執行提交,那麼SP2中會發生什麼並不重要。 SP1中所做的更改不會回滾 - 它們已被提交。

1

如果您的第一個存儲過程總是發出提交或回滾,則第二存儲過程不會影響該事務。

如果您希望調用應用程序控制整個事務,但存儲過程處理在出現錯誤時回滾自己的更改,則一種方法是在存儲過程開始時定義一個保存點。然後,存儲過程的異常塊可以回滾到保存點,而不是事務的開始(提交,在這種情況下,不應該包含在存儲過程中)。當然,在這種情況下,存儲過程通知應用程序發生錯誤以及應用程序適當地處理該情況很重要。