Member-515487 Ответов: 1

Transactionscope выбрасывает исключение эта платформа не поддерживает распределенные транзакции при открытии объекта подключения


TransactionScope выбрасывает исключение я использую .net core 2.2

В этом примере я сначала создаю область действия TransactioScop затем открываю SQL транзакцию для одной базы данных которая работает нормально затем после первой транзакции я вызываю commit который будет фиксировать SQL транзакцию затем я пытаюсь открыть вызов транзакции для другой базы данных при создании транзакционной системы выбрасывая исключение

как
This platform does not support distributed transactions.


создавая сделки в 2 этапа сначала создать объект подключения затем открыть подключение к 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();
            }


Message "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()


Что я уже пробовал:

попытался удалить SQL транзакцию

1 Ответов

Рейтинг:
1

lmoelleb

На случай если вы спрашиваете: "почему мой код пытается создать распределенную транзакцию"

Потому что у вас есть соединение с двумя базами данных внутри одной области транзакции. Если это не является намерением, поместите каждый доступ к БД в свой собственный оператор using для области транзакции.

На случай если вы спрашиваете: Почему я не могу создать распределенную транзакцию

.NET core пока не поддерживает распределенные транзакции, и нет никакой временной шкалы, когда (если) это будет сделано. Вы можете следить за ним здесь:
Реализуйте распределенные/продвигаемые транзакции в системе.Операции. · Выпуск #13532 · dotnet/corefx · GitHub[^]
В целом распределенные транзакции вышли из моды из-за проблем с масштабированием и часто не поддерживаются в современной инфраструктуре, что делает их гораздо менее приоритетными, чем можно было бы ожидать.