簡體   English   中英

使用相同連接的TransactionScope和方法調用

[英]TransactionScope and method call that uses the same connection

我正在使用TransactionScope使包含多個事務性SQL語句的方法。 現在,我需要調用也使用相同連接的第二個方法,並且在connection.Open()處收到以下異常:

分布式事務管理器(MSDTC)的網絡訪問已被禁用。 請使用組件服務管理工具在MSDTC的安全配置中為網絡訪問啟用DTC。

所以這是偽代碼:

public static void Method1()
{
    using (TransactionScope scope = new TransactionScope())
    {
        bool success = true; // will be set to false in an omitted catch
        using (var connection = new SqlConnection(ConnectionString1))
        {
           // ...
           if(somethingHappened)
               Method2();
        }
        if(success)
            scope.Complete();
    }
}

public static void Method2()
{
    using (var connection = new SqlConnection(ConnectionString1))
    {
        connection.Open(); // BOOOM!
        // ...
    }
}

如何避免不從重復碼這個例外Method2Method1

如果在同一個TransactionScope下打開一個以上的連接,它將自動升級為DTC。

您需要在調用Method2之前關閉第一個連接。

public static void Method1()
{
    using (TransactionScope scope = new TransactionScope())
    {
        bool success = true; // will be set to false in an omitted catch

        bool isSomethingHappened
        using (var connection = new SqlConnection(ConnectionString1))
        {
           isSomethingHappened = // Execute query 1
        }

       if(somethingHappened)
           Method2();

        if(success)
            scope.Complete();
    }
}

同一事務范圍內的嵌套連接將升級為分布式事務。

從SQL Server 2008及更高版本開始,同一事務范圍內的多個(非嵌套)連接將不會升級為分布式事務。

查看問題以獲取更多信息

我不知道確切的答案,但是我會讓連接成為成員,並跟蹤連接是否打開。

然后在Method1和Method2中,我將通過一些GetConnection()獲得連接,該連接將在首次使用時打開連接。


閱讀評論后,我建議使用一個私有的DoMethod2,它接受一個連接對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM