web-dev-qa-db-ja.com

分散トランザクション:.NET Frameworkと.NET Core

次のコードサンプルがあります。

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に2differentconnectionstringsを使用しても成功します接続!

6
chrisv

transactionscope。Net Core 2.0で導入はユースケースをカバーしていますか?
をご覧ください。

0
Rzassar