Ich bin etwas überrascht, dass Sie das sehen, weil RequiresNew
sollte bedeutet, dass es von der anderen Transaktion isoliert ist; Normalerweise bedeutet diese Meldung, dass 2 Verbindungen innerhalb eines Transaktionsbereichs aktiviert wurden - sind Sie sicher Gibt es keinen anderen Code, der eine Verbindung innerhalb dieses Blocks erstellt / öffnet?
Ihre vorgeschlagene Lösung sollte funktionieren - obwohl in gewisser Weise TransactionScopeOption.Suppress
kann bequemer sein, als Ihre Konfiguration zu ändern (aber beides sollte funktionieren). Allerdings gibt es ein Problem:ADO.NET-Transaktionen müssen an die einzelnen Befehle übergeben werden, also müssten Sie (auch den Code etwas aufräumen):
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
wobei CommitChanges
akzeptiert eine Transaktion - vielleicht mit optionalen Parametern:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
Ihre Benennung von DapperFactory
schlägt vor, dass Sie "dapper" verwenden - in diesem Fall können Sie das einfach an "dapper" übergeben, unabhängig davon, ob es null ist oder nicht, dh
conn.Execute(sql, args, transaction: transaction);