Jestem nieco zaskoczony, że to widzisz, ponieważ RequiresNew
powinien oznaczają, że jest oddzielony od innej transakcji; zwykle ten komunikat oznacza, że 2 połączenia zostały aktywowane w zakresie transakcji - czy jesteś pewny? nie ma innego kodu tworzącego / otwierającego połączenie wewnątrz tego bloku?
Zaproponowane rozwiązanie powinno działać - chociaż w pewnym sensie TransactionScopeOption.Suppress
może być wygodniejsze niż zmiana konfiguracji (ale obie powinny działać). Jest jednak problem:transakcje ADO.NET muszą być przekazywane do poszczególnych poleceń, więc potrzebujesz (również trochę porządkując kod):
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
gdzie CommitChanges
akceptuje transakcję - być może używając opcjonalnych parametrów:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
Twoja nazwa DapperFactory
sugeruje, że używasz "dapper" - w takim przypadku możesz po prostu przekazać to do "dapper", niezależnie od tego, czy jest null, czy nie, tj.
conn.Execute(sql, args, transaction: transaction);