Jag är något förvånad över att du ser detta, eftersom RequiresNew
bör betyder att den är isolerad från den andra transaktionen; vanligtvis betyder det här meddelandet att två anslutningar har aktiverats inom ett transaktionsomfång - är du säker finns det ingen annan kod som skapar/öppnar en anslutning i det blocket?
Din föreslagna lösning borde fungera - även om det på vissa sätt är TransactionScopeOption.Suppress
kan vara bekvämare än att ändra din konfiguration (men båda borde fungera). Det finns dock ett problem:ADO.NET-transaktioner måste skickas till de individuella kommandona, så du skulle behöva (också göra i ordning koden lite):
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
där CommitChanges
accepterar en transaktion - kanske med valfria parametrar:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
Ditt namn på DapperFactory
föreslår att du använder "dapper" - i så fall kan du bara skicka det till "dapper" oavsett om det är null eller inte, dvs.
conn.Execute(sql, args, transaction: transaction);