Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用相同连接的TransactionScope和方法调用_C#_Sql Server 2012_Transactions_Ado.net_Transactionscope - Fatal编程技术网

C# 使用相同连接的TransactionScope和方法调用

C# 使用相同连接的TransactionScope和方法调用,c#,sql-server-2012,transactions,ado.net,transactionscope,C#,Sql Server 2012,Transactions,Ado.net,Transactionscope,我正在使用创建一个包含多个sql语句的方法。现在我需要调用第二个方法,该方法也使用相同的连接,我在connection.Open()处收到以下异常: 分布式事务管理器(MSDTC)的网络访问已完成 残废请在安全设置中为网络访问启用DTC 使用组件服务管理配置MSDTC 工具 这是伪代码: public static void Method1() { using (TransactionScope scope = new TransactionScope()) {

我正在使用创建一个包含多个sql语句的方法。现在我需要调用第二个方法,该方法也使用相同的连接,我在
connection.Open()
处收到以下异常:

分布式事务管理器(MSDTC)的网络访问已完成 残废请在安全设置中为网络访问启用DTC 使用组件服务管理配置MSDTC 工具

这是伪代码:

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!
        // ...
    }
}

如何避免此异常而不重复
Method1
Method2
中的代码?

我不知道确切答案,但我会将该连接设为成员,并跟踪它是否打开

然后在Method1和Method2中,我将通过一些GetConnection()获得连接,这将在第一次使用时打开连接



在阅读了这些评论之后,我建议使用一个私有的DoMethod2,它接收一个连接对象

我不知道确切的答案,但我会让这个连接成为一个成员,并跟踪它是否打开

然后在Method1和Method2中,我将通过一些GetConnection()获得连接,这将在第一次使用时打开连接



在阅读了这些评论之后,我建议使用一个私有的DoMethod2,它接收一个连接对象

如果在同一
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();
    }
}

如果在同一
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及更高版本开始,同一事务作用域下的多个(非嵌套)连接将不会升级为分布式事务


有关更多信息,请参见问题

相同事务作用域下的嵌套连接将升级为分布式事务

从SQL server 2008及更高版本开始,同一事务作用域下的多个(非嵌套)连接将不会升级为分布式事务


有关更多信息,请参见问题

我也得到了这个答案,但在不同的连接字符串上,请检查答案是否为64票helps@Steve,应在不同的连接字符串上出现此错误behavior@mybirthname:如果可能,我希望避免使用MSDTC,因为它不需要额外的开销。如果我理解正确,只有当一个分布式事务涉及多台物理计算机时,才需要使用DTC。事实并非如此,它是同一台服务器上的同一个数据库,实际上是同一个连接字符串。如果同时打开多个连接,它将自动升级到DTC-但不确定Sql server的版本我也得到了这一点,但是在不同的连接字符串上。请检查答案是否为64helps@Steve,应在不同的连接字符串上出现此错误behavior@mybirthname:如果可能,我希望避免使用MSDTC,因为它不需要额外的开销。如果我理解正确,只有当一个分布式事务涉及多台物理计算机时,才需要使用DTC。事实并非如此,它是同一服务器上的同一数据库,实际上是同一个连接字符串。如果同时打开多个连接,它将自动升级到DTC,但不确定Sql server的版本。问题是关于相同的连接字符串,而不是相同的连接:/Ah。问题是关于相同的连接字符串,而不是相同的连接:/