分布式事务:.NET Framework与.NET Core

问题描述 投票:4回答:2

我有以下代码示例:

static void Main(string[] args)
{
    TransactionManager.DistributedTransactionStarted += (sender, eventArgs) =>
    {
        Console.WriteLine("Promoted to distributed transaction!");
    };
​
    const string connectionString = @"Server=localhost\SQLEXPRESS;Database=master;Integrated Security=true;";
​
    using (var tx = new TransactionScope())
    using (var conn1 = new SqlConnection(connectionString))
    using (var conn2 = new SqlConnection(connectionString))
    {
        conn1.Open();
        Console.WriteLine("conn1 opened");
​
        conn2.Open();
        Console.WriteLine("conn2 opened");
​
        tx.Complete();
    }
​
    Console.ReadLine();
​
}

[在.NET Framework(4.8)控制台应用程序中执行此代码(针对SQL Server Express 2017)时,将产生以下输出:

Output of code in .NET Framework Console

由于该事务已被提升为分布式事务,因此我期望以.NET Core(3.0)为目标的类似控制台应用程序会抛出一个

System.PlatformNotSupportedException(此平台不支持分布式事务。)。

但是,实际输出是:

Output of code in .NET Core Console

为什么?我希望将事务提升为分布式事务与框架无关。


编辑:此.NET Core(3.0)代码示例对数据库连接有作用:

数据库架构:

CREATE DATABASE [TestDB1] 
GO
CREATE TABLE [TestDB1].[dbo].[Table]([Value] [nvarchar](max) NULL) 

。NET Core(3.0)控制台应用程序:

static void Main(string[] args)
{
    TransactionManager.DistributedTransactionStarted += (sender, eventArgs) =>
    {
        Console.WriteLine("Promoted to distributed transaction!");
    };

    const string connectionString = @"Server=localhost\SQLEXPRESS;Database=TestDB1;Integrated Security=true;";

    using (var tx = new TransactionScope())
    using (var conn1 = new SqlConnection(connectionString))
    using (var conn2 = new SqlConnection(connectionString))
    {
        conn1.Open();
        Console.WriteLine("conn1 opened");
        using (var cmd1 = conn1.CreateCommand())
        {
            cmd1.CommandText = "INSERT INTO [dbo].[Table] ([Value]) VALUES ('test 1')";
            cmd1.ExecuteNonQuery();
            Console.WriteLine("Record inserted through conn1");
        }

        conn2.Open();
        Console.WriteLine("conn2 opened");
        using (var cmd2 = conn2.CreateCommand())
        {
            cmd2.CommandText = "INSERT INTO [dbo].[Table] ([Value]) VALUES ('test 1')";
            cmd2.ExecuteNonQuery();
            Console.WriteLine("Record inserted through conn2");
        }

        tx.Complete();
        Console.WriteLine("Transaction completed");
    }

    Console.ReadLine();
}

和控制台输出:

.NET Core Console output when doing something with the connections

注意:对于2个连接使用2个different连接字符串,此示例也会成功!

c# .net sql-server .net-core msdtc
2个回答
0
投票

NET Core 不]支持分布式事务,因为在每个平台上都需要不同的事务管理器。您可以在https://github.com/dotnet/runtime/issues/715上找到有关此问题的更多信息。

[此功能似乎已在2020年11月30日之前从.NET发行版5.0中添加]

还有另一个线程SA在谈论这个问题。


0
投票

有人在.NET Core 3.0和System.Data.SqlClient中使用分布式事务吗?

我在Windows本地遇到以下问题:“此平台不支持分布式事务。”

当我使用AppService和Azure Sql将其部署到Azure时,它可以正常工作。

希望有人可以帮助我。

© www.soinside.com 2019 - 2024. All rights reserved.