分散トランザクションを実行していますが、まれに次のエラーが発生することがあります。
System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。オブジェクト名: 'SqlDelegatedTransaction'。System.Data.SqlClient.SqlDelegatedTransaction.Rollback(SinglePhaseEnlistment enlistment) で System.Transactions.TransactionStateDelegatedAborting.EnterState(InternalTransaction tx) で System.Transactions.Transaction.Rollback() で System.Transactions.TransactionScope.InternalDispose() で System.Transactions .TransactionScope.Dispose()
エラーは、TransactionScope がスコープ外になり、Complete() がスコープ内で呼び出されていない場合に発生します。予想される動作は、トランザクションがサイレントにロールバックすることです。トランザクションはコミットされないため、データベースに破損したデータはありません。余談ですが、nhibernate を使用していることにも言及できます。プログラムの流れは次のとおりです。
using (var transaction = new TransactionScope())
{
using (var session = _sessionManager.OpenSession())
{
// we have to wrap the invocation with an nhibernate transaction due to a dtc bug: http://www.mail-archive.com/nhibernate-development@googlegroups.com/msg02306.html
using (ITransaction nhibernateTrans = session.Session.BeginTransaction())
{
// code altering session data goes here
nhibernateTrans.Commit();
}
}
transaction.Complete();
}
これはおそらく 2 か月に 1 回か 2 回発生しているため、一貫して確認されているわけではなく、一度発生すると再現することはできません。サービスに対して同じ値で同じコマンドを実行すると、期待どおりに機能します。