2013-03-20 74 views
3

我在TransactionScope中使用兩個SQLConnection是(僞)代碼是否正確?使用語句在哪裏完成TransactionScope?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
    using (SqlConnection connection1 = new SqlConnection(ConnectionString1)) 
     { 
     (...) 
     } 

    using (SqlConnection connection2 = new SqlConnection(ConnectionString2)) 
     { 
      (...) 
     } 

    ts.Complete(); 
    } 

還是應該用這個?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
    using (SqlConnection connection1 = new SqlConnection(ConnectionString1)) 
     { 
     (...) 
     using (SqlConnection connection2 = new SqlConnection(ConnectionString2)) 
      { 
      (...) 
      ts.Complete(); 
      } 
     } 
    } 

第一個代碼更好,因爲它允許我在方法中提取命令。但是我擔心的是,在這種情況下,連接是在範圍完成之前處理的,是否將TransactionScope納入足以防止這種情況?

回答

1

嵌套連接處理完畢後,調用Complete沒有任何問題。事務的生命週期有意地大於SQL連接的生命週期,並且您可以繼續與其交互,而與任何其他連接的生命週期無關。

所以是的,在你的第一個例子中,你在連接處理後調用Complete並且這很好

根據Transaction Scope以及this page on how to use transaction scopes文檔中的示例,您可以看到事務可以在連接處理完成後完成。

+0

以下Servy建議我已經在第一個示例之後編寫了我的代碼,並且我能夠測試它的行爲如預期的那樣(如果在事務範圍內沒有調用.Complete(),則連接將回滾 – floqui 2013-03-21 08:43:55

0

還有第三種可能性:

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew)) 
using (SqlConnection connection1 = new SqlConnection(ConnectionString1)) 
using (SqlConnection connection2 = new SqlConnection(ConnectionString2)) 
{ 
    // ... 
    ts.Complete() 
} 
+3

這與他提到的第二個相同,只是沒有{} – Brendan 2013-03-20 15:01:27

1

在第一個示例中,兩個連接都在ts.Complete()被調用之前處理,這不是問題,因爲ts.Complete()方法不使用連接:

  • 既連接該方法內聲明本地和將超出範圍爲任何其他方法
  • 連接不傳遞給ts.Complete()方法,以使它們範圍

在你的第二個例子,當兩個連接仍然存在時調用ts.Complete()方法,但是,它們不傳遞給方法,因此不能使用。

這意味着這兩種方法都可以正常工作,並且在調用ts.Complete()之前是否放置連接並不重要。

+0

'如果你需要在連接被處理之前調用ts.Complete()'什麼使你認爲需要完成?我沒有看到它需要完成的跡象。 – Servy 2013-03-20 15:16:23

+0

@Servy從OP:'但是我擔心的是,在這種情況下,連接是在完成範圍之前處理的。 – 2013-03-20 15:18:09

+0

是的,他們是,*,這根本不是問題*。這就是正確的答案。 – Servy 2013-03-20 15:19:19