gpt4 book ai didi

c# - 分布式事务 : . NET Framework 与 .NET Core

转载 作者:行者123 更新时间:2023-12-03 09:34:01 24 4
gpt4 key购买 nike

我有以下代码示例:

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 (This platform does not support distributed transactions.).



但是,实际输出是:

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 个不同的连接字符串时,此示例也会成功!

最佳答案

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

此功能似乎已添加到 .NET 的 5.0 版 截止日期为 2020 年 11 月 30 日

还有一个帖子 SA说到这个问题。

关于c# - 分布式事务 : . NET Framework 与 .NET Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59135418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com