RequiresNew
が すべき 他のトランザクションから分離されていることを意味します。通常、このメッセージは、トランザクション スコープ内で 2 つの接続がアクティブ化されたことを意味します - Are you sure そのブロック内で接続を作成/開く他のコードはありませんか?
提案されたソリューションは機能するはずですが、いくつかの方法で TransactionScopeOption.Suppress
設定を変更するよりも便利かもしれません (ただし、どちらも機能するはずです)。ただし、問題があります。ADO.NET トランザクションを個々のコマンドに渡す必要があるため、以下が必要になります (コードも少し整理します)。
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
どこで CommitChanges
トランザクションを受け入れます - おそらくオプションのパラメータを使用します:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
DapperFactory
の命名 「dapper」を使用していることを示唆しています - その場合、それが null であるかどうかにかかわらず、「dapper」に渡すことができます。つまり、
conn.Execute(sql, args, transaction: transaction);