2014-10-30 162 views
1

我有一個過程Proc1調用另一個過程Proc2,並與「BEGIN TRANSCTION」 如果我在第二個過程中得到一個錯誤,它將回滾這兩個過程。好!在存儲過程回滾vs回滾在C#代碼

但我的C#代碼中,我也有這個

... 
    dbCommand.Transaction.Commit(); 
       dbCnn.Close(); 
      } 
      catch (Exception ex) 
      { 
       if (dbCommand.Transaction != null) 
        **dbCommand.Transaction.Rollback();** 
       if (dbCnn.State == ConnectionState.Open) 
        dbCnn.Close(); 

       throw ex; 
      } 

是否 「dbCommand.Transaction.Rollback();」知道我在談論哪個交易?如果我有兩個事務吃了同樣的過程,沒有標籤,那麼C#回滾正確的事務會是一個問題嗎?

+1

沒有「兩次交易」這樣的事情 - 您可以隨心所欲地開始交易,如果您願意,可以獲得@@ TRANCOUNT爲500,但是如果您執行一次ROLLBACK,它們將全部回滾。就我個人而言,我將事務控制保存在存儲過程中 - 我發現很少有C#應用程序需要參與的情況。 – 2014-10-30 13:38:21

回答

2

「dbCommand.Transaction.Rollback();」知道我在談論哪個交易 ?

不,它也不在意。它回滾連接級別上的所有事務。裏面的一切都是這個交易的一部分。

如果我有兩個事務吃了同樣的過程,沒有標籤, 會是C#回滾正確事務的問題嗎?

您不能有兩個交易。事務形成一個層次。上面的代碼回滾了整個頂級連接級別事務。您在存儲過程中打開的每一個其他事務都是此事務的一部分。

+0

對不起,我現在有點困惑。問題是,我不能或者我不應該在sql server代碼中放置2個事務?因爲我在這裏創建了一個例子,在proc裏面有兩個tansactions,它可以工作 – Mucida 2014-10-30 15:59:37

+1

你可以。是否有意義是你的問題(代碼不關心)。許多事情都有附帶的商業案例。 – TomTom 2014-10-30 16:02:03

1

由於您在C#代碼中定義了事務,因此不需要在SQL代碼中添加事務。如果在C#事務中處理的SQL代碼中出現任何錯誤,那麼回滾否則提交。

+0

但是在sql代碼裏面有一個try-catch,它會在它發生的時候發現一個錯誤,所以它會阻止其他的sql被執行。如果我讓c#處理回滾,它是否也停止查詢或它會在過程結束後回滾(當sql將結果返回給c#時) – Mucida 2014-10-30 19:16:27

+1

由於SQL代碼中發生錯誤,它將返回到c#代碼,然後在TransactionScope中基於成功或失敗,您必須提交或回滾C#事務。假設,你有三個不同的SQL命令需要從c#代碼順序執行。然後用C#中的sqlconnection打開TransactionScope(),然後Fire first sql命令,假設成功執行了此sql命令,然後根據返回值(這裏是真/假),然後如果成功,則觸發下一個命令或回滾C#TransactionScope()。 – HaveNoDisplayName 2014-10-30 19:47:58