c# - Transactionscope 抛出异常此平台在打开连接对象时不支持分布式事务

标签 c# sql-server .net-core

TransactionScope 在 .net core 2.2 中抛出异常

在这个例子中,我创建了一个 TransactioScop 范围。 为一个工作正常的数据库打开 SQL 事务。
在我调用 commit 的第一个事务之后,它将提交 SQL 事务。 我尝试在创建事务时为另一个数据库打开调用事务,但系统抛出异常

This platform does not support distributed transactions.

试图删除 SQL 事务

c#

using (TransactionScope scop =new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled))
{       
    _db1UOW.Begin(); //creating sql transaction
    await _db1UOW.IDenialDetailsRepositorydb1.InsertDenialDetails(denialsDetails);
    await _db1UOW.IRuleDetailsRepositorydb1.InsertRulesDetails(rulesDetails);
    _db1UOW.Commit(); //commitng sql transaction

    _db2UOW.Begin(); //creating sql transaction (but while opening connection object its throwing exception as This platform does not support distributed transactions)
    await _db2UOW.IRuleDetailsRepository.GetRulesDetails();
    await _db2UOW.IDenialDetailsRepository.InsertDenialDetails(denialsDetails);
    var data = await _db2UOW.IRuleDetailsRepository.InsertRulesDetails(rulesDetails);
    _db2UOW.Commit(); //commitng sql transaction
    scop.Complete();
}

留言

"This platform does not support distributed transactions."  at System.Transactions.Distributed.DistributedTransactionManager.GetDistributedTransactionFromTransmitterPropagationToken(Byte[] propagationToken)
   at System.Transactions.TransactionInterop.GetDistributedTransactionFromTransmitterPropagationToken(Byte[] propagationToken)
   at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
   at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
   at System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
   at System.Transactions.Transaction.Promote()
   at System.Transactions.TransactionInterop.ConvertToDistributedTransaction(Transaction transaction)
   at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
   at System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
   at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
   at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
   at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
   at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()

最佳答案

.NET Core 不支持分布式事务,因为它需要在每个平台上使用不同的事务管理器。它可能会在未来出现(here 是正在进行的问题),但目前任何需要两个不同资源管理器的事务都会抛出此异常。

相反,您可以协调单独的事务。让两个单独的事务完成它们的工作,然后将它们都提交。 有可能第一次提交成功而第二次提交失败,但对于 SQL Server(使用 one exception ),这种情况非常罕见。像这样的东西:

_db1UOW.Begin(); //creating sql transaction
await _db1UOW.IDenialDetailsRepositorydb1.InsertDenialDetails(denialsDetails);
await _db1UOW.IRuleDetailsRepositorydb1.InsertRulesDetails(rulesDetails);

_db2UOW.Begin(); //creating sql transaction 
await _db2UOW.IRuleDetailsRepository.GetRulesDetails();
await _db2UOW.IDenialDetailsRepository.InsertDenialDetails(denialsDetails);
var data = await _db2UOW.IRuleDetailsRepository.InsertRulesDetails(rulesDetails);
 
_db1UOW.Commit(); //commitng sql transaction
try
{
    _db2UOW.Commit(); //commitng sql transaction
}
catch (Exception ex)
{
     LogError("Second transaction failed to commit after first one committed.  Administrators may need to fix stuff");
     throw;
}

或者,如果这两个数据库位于同一台服务器上,您可以使用带有单个 SqlConnection 的跨数据库查询来获取单个 SQL Server 事务中的更改。

关于c# - Transactionscope 抛出异常此平台在打开连接对象时不支持分布式事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56328832/

相关文章:

c# - 访问网络驱动器上的文件

c# - 使用 Fluent NHibernate 映射树结构

c# - 如何在 C# 应用程序中安全地存储数据库登录名和密码?

sql-server - 使用 RODBC 和 MS SQL Server 长时间运行的查询超时

c# - 如何在 .NET Core 中逐行下载文件?

c# - 复选框值始终为空,即使我选中它

c# - 查看在哪个 AppDomain 中加载了一个对象

sql - 按照 DTA 的建议添加 NONCLUSTERED INDEX 会提高性能吗?

c# - VS 2017 中的创建单元测试在哪里?

azure - Core 2.2 上的 SignalR 部署到 Azure 时失败