sql >> Base de Datos >  >> RDS >> Sqlserver

SqlConnection y evitar la promoción a MSDTC

Estoy algo sorprendido de que veas esto, porque RequiresNew debería significar que está aislado de la otra transacción; por lo general, este mensaje significa que se han activado 2 conexiones dentro del alcance de una transacción. ¿Está seguro? ¿No hay otro código que cree o abra una conexión dentro de ese bloque?

Su solución propuesta debería funcionar, aunque de alguna manera TransactionScopeOption.Suppress puede ser más conveniente que cambiar su configuración (pero cualquiera debería funcionar). Sin embargo, hay un problema:las transacciones de ADO.NET deben pasarse a los comandos individuales, por lo que necesitaría (también ordenar un poco el código):

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

donde CommitChanges acepta una transacción, quizás usando parámetros opcionales:

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

Tu nombre de DapperFactory sugiere que está usando "dapper", en cuyo caso, puede pasarlo a "dapper", ya sea que sea nulo o no, es decir,

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