J'ai l'exemple de code suivant:
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();
}
Lors de l'exécution de ce code dans une application console .NET Framework (4.8) (par rapport à SQL Server Express 2017), il produit la sortie suivante:
Étant donné que la transaction est promue vers une transaction distribuée, je m'attends à ce qu'une application console similaire ciblant .NET Core (3.0) lance un
System.PlatformNotSupportedException ( Cette plateforme ne prend pas en charge les transactions distribuées. ).
Cependant, la sortie réelle est:
Pourquoi est-ce? Je m'attends à ce que la promotion d'une transaction vers une transaction distribuée soit indépendante du framework.
Edit: Cet exemple de code .NET Core (3.0) fait quelque chose avec les connexions à la base de données:
Schéma de base de données:
CREATE DATABASE [TestDB1]
GO
CREATE TABLE [TestDB1].[dbo].[Table]([Value] [nvarchar](max) NULL)
Application console .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();
}
Et la sortie de la console:
Remarque: Cet exemple réussit également lorsque vous utilisez 2 différentes chaînes de connexion pour les 2 Connexions!
transactionscope introduit dans .Net Core 2.0 couvre votre cas d'utilisation?
Jetez un œil à son exemple .