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