Транзакция выдает исключение: эта платформа не поддерживает распределенные транзакции при открытии объекта подключения. - PullRequest
0 голосов
/ 27 мая 2019

Исключение TransactionScope, которое я использую .net core 2.2

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

в качестве Сообщение «Эта платформа не поддерживает распределенные транзакции».

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

с #

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

1 Ответ

0 голосов
/ 27 мая 2019

.NET Core не поддерживает распределенные транзакции, поскольку для каждой платформы требуется отдельный менеджер транзакций. Это может появиться в будущем, но на данный момент любая транзакция, которая потребует двух разных менеджеров ресурсов, сгенерирует это исключение.

Вместо этого вы координируете отдельные транзакции. Завершите свою работу две отдельные транзакции, а затем передайте их обе. Существует возможность , что первый завершается успешно, а второй - нет, но для SQL Server это было бы очень редким явлением. Что-то вроде:

            _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;
            }

Или, если две базы данных находятся на одном сервере, вы можете использовать кросс-запросы базы данных, чтобы внести изменения в одну транзакцию SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...