Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SqlConnection ed evitare la promozione a MSDTC

Sono un po' sorpreso che tu lo veda, perché RequiresNew dovrebbe significa che è isolato dall'altra transazione; di solito, questo messaggio significa che sono state attivate 2 connessioni all'interno di un ambito di transazione - sei sicuro non c'è altro codice che crea / apre una connessione all'interno di quel blocco?

La soluzione proposta dovrebbe funzionare, anche se in qualche modo TransactionScopeOption.Suppress potrebbe essere più conveniente che modificare la configurazione (ma entrambi dovrebbero funzionare). Tuttavia, c'è un problema:le transazioni ADO.NET devono essere passate ai singoli comandi, quindi avresti bisogno (anche riordinando un po' il codice):

using(var transaction = conn.BeginTransaction()) {
    try {
        var count = _changeTracker.CommitChanges(conn, transaction);
        transaction.Commit();
        return count;
    } catch {
        transaction.Rollback();
        throw;
    }
}

dove CommitChanges accetta una transazione, magari utilizzando parametri opzionali:

int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }

La tua denominazione di DapperFactory suggerisce che stai usando "dapper" - nel qual caso, puoi semplicemente passarlo in "dapper" indipendentemente dal fatto che sia nullo o meno, ad es.

conn.Execute(sql, args, transaction: transaction);