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

SqlConnection e evitando promoção para MSDTC


Estou um pouco surpreso que você esteja vendo isso, porque o RequiresNew deveria significa que está isolada da outra transação; geralmente, esta mensagem significa que 2 conexões foram ativadas dentro de um escopo de transação - você certeza não existe outro código criando/abrindo uma conexão dentro desse bloco?

Sua solução proposta deve funcionar - embora em alguns aspectos TransactionScopeOption.Suppress pode ser mais conveniente do que alterar sua configuração (mas ambos devem funcionar). No entanto, há um problema:as transações ADO.NET devem ser passadas para os comandos individuais, então você precisaria (também arrumando um pouco o código):
using(var transaction = conn.BeginTransaction()) {
    try {
        var count = _changeTracker.CommitChanges(conn, transaction);
        transaction.Commit();
        return count;
    } catch {
        transaction.Rollback();
        throw;
    }
}

onde CommitChanges aceita uma transação - talvez usando parâmetros opcionais:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }

Seu nome de DapperFactory sugere que você está usando "dapper" - nesse caso, você pode simplesmente passar isso para "dapper", seja nulo ou não, ou seja,
conn.Execute(sql, args, transaction: transaction);