次のコードサンプルがあります。
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に対して)、次の出力が生成されます。
トランザクションが分散トランザクションに昇格しているため、.NET Core(3.0)をターゲットとする同様のコンソールアプリケーションが
System.PlatformNotSupportedException(このプラットフォームは分散トランザクションをサポートしていません。)。
ただし、実際の出力は次のとおりです。
どうしてこれなの?トランザクションの分散トランザクションへの昇格は、フレームワークにとらわれないものであると期待しています。
編集:この.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();
}
そしてコンソール出力:
注:このサンプルは、2に2differentconnectionstringsを使用しても成功します接続!
transactionscope。Net Core 2.0で導入はユースケースをカバーしていますか?
例 をご覧ください。