2010-09-15 36 views
3

我想做成事務的一系列SP調用(SQL Server 2005中)在周邊的一些部分業務邏輯與C#得到的TransactionScope交易當前連接

using(TransactionScope...) 

不幸的一個.NET 2.0的項目,我繼承來自另一個項目的DAL,我不想在那裏做很多更改......問題是每個調用存儲過程的方法都會打開一個新的連接。

所以,我的問題是:有沒有辦法檢索當前事務使用的連接,即從Transaction.Current ??

謝謝

s。

UPDATE:請告訴我這是什麼不對的控制檯應用程序(VS2005,.NET 2.0,SQL Server 2005中)

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data.SqlClient; 
using System.Data; 
using System.Transactions; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required)) 
      { 
       Console.WriteLine("1"); 
       test(); 
       Console.WriteLine("2"); 
       test(); 
      } 
      Console.WriteLine("END"); 
     } 

     public static void test() 
     { 
      string connectionString = @"Persist Security Info=True;User ID=usr123;Password=123;Initial Catalog=db123;Data Source=myserver\myinstance;Connect Timeout=180;"; 

      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       conn.Open(); 
      } 
     } 
    } 
} 
+0

如果你是一個TransactionScope內,你可以創建自己的連接,這將自動地(在我認爲的情況下)自己進入範圍。那是你想要避免的嗎? – arootbeer 2010-09-15 15:27:05

+0

是的,DAL中的每個方法都是在對一個新的SqlConnection(「querystring ..」)進行隔離,將其打開(),然後在SqlCommand中使用它。可能問題是每個方法也是Dispose()ing或關閉()它! – socste2 2010-09-15 15:53:38

+0

因此,您試圖查看TransactionScope本身用於與數據庫通信的連接嗎? – arootbeer 2010-09-15 15:56:18

回答

0

除非你不使用連接池由於某種原因,沒有很好的理由不要只是新建一個SqlConnection並去鎮上。讓運行時處理製作該性能的細節 - 這就是連接池的用途。這聽起來像DAL書寫正確:

... 
using (var conn = new SqlConnection("connection string")) 
{ 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     //Do stuff with cmd 
    } 
} 
.... 

即使你不使用連接池(和你不這樣做的正當理由),最好的路徑很可能仍然將是新的了一個SqlConnection並去鎮上。您不希望意外執行某些操作,例如關閉事務範圍正在使用的連接,並假設它實際上有一個SqlConnection供您參考。

+0

好吧,我用我正在使用的代碼編寫問題來測試它..當它嘗試conn.Open()第二次,我得到異常「分佈式事務管理器(MSDTC)的網絡訪問已被禁用...」 – socste2 2010-09-15 16:59:43

+0

您是否連接到遠程數據庫服務器或本地計算機上的實例? – arootbeer 2010-09-15 17:09:10

+0

這是一個遠程服務器.. Microsoft SQL Server標準版,版本9.00.4035.00 – socste2 2010-09-15 17:17:07

1

OK,一兩件事情:

  1. 我懷疑的TransactionScope甚至有一個(SQL)連接的概念。原因是它可以處理各種事務資源,無論是數據庫,消息隊列系統還是其他類型的資源。您可能想要參考MSDN Docs for System.Transactions以獲取更多信息。所以,我想你的方法註定要失敗開始。

  2. 在您的示例中,您缺少「ts.Complete()」調用,因此您的(分佈式)事務將始終在using-Scope結束時回滾。現在,這與你所描述的問題無關,但值得指出。

  3. 由於您在其中使用多個連接,因此您的環境事務(由TransactionScope-in​​stance類似事務)傳播到分佈式事務。所以基本上,系統上的DTC需要與數據庫服務器上的DTC進行通話。要做到這一點,必須正確配置。

要配置DTC,請執行g C:\Windows\System32\com\comexp.msc運行「組件服務」管理控制檯。在樹狀視圖中導航到「組件服務\計算機\我的電腦」。在上下文菜單中打開「屬性」。在適當的對話框中選擇「MSDTC」選項卡,在其上單擊「安全配置...」按鈕。

在該對話框中確保下列選項被選中:

  • 「網絡DTC訪問」
  • 「允許遠程客戶端」
  • 「允許入站」
  • 「允許出站」
  • 「啓用事務Internet協議(TIP)事務」
  • 「啓用XA事務」

(注:其中的一些可能實際上並不需要,因人而異)

您可能還需要設置爲「不要求進行驗證」,這取決於你的本地策略/需求。

您需要在兩個系統上執行此操作:您的應用程序運行的那個和數據庫的一個。

+0

好的,無論如何,謝謝你.. ..我將做一些重構來跟蹤TransactionScope中的單個SqlConnection .. – socste2 2010-09-16 07:47:47

1

好了,謝謝大家.. ..finally我最後寫的東西一樣可以在企業圖書館找到Microsoft.Practices.EnterpriseLibrary.Data.TransactionScopeConnections(http://entlib.codeplex.com)..

相關問題