Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Exceção de lançamento de Transactionscope esta plataforma não suporta transações distribuídas ao abrir o objeto de conexão


O .NET Core não oferece suporte a transações distribuídas porque exigiria um gerenciador de transações diferente em cada plataforma. Pode aparecer no futuro (aqui está o problema em andamento), mas por enquanto qualquer transação que exigiria dois gerenciadores de recursos diferentes lançará essa exceção.

Em vez disso, você pode coordenar transações separadas. Faça com que duas transações separadas concluam seu trabalho e, em seguida, confirme as duas. Existe uma possibilidade que o primeiro commit seja bem-sucedido e o segundo falhe, mas para o SQL Server, isso seria uma ocorrência muito rara. Algo como:
            _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;
            }

Ou se os dois bancos de dados estiverem no mesmo servidor, você poderá usar consultas entre bancos de dados com um único SqlConnection para listar as alterações em uma única transação do SQL Server.