1

実稼働サーバーでこの例外が発生することがあります。

System.ArgumentNullException: Value cannot be null.
   at System.Threading.Monitor.Enter(Object obj)
   at System.Data.ProviderBase.DbConnectionPool.TransactedConnectionPool.TransactionEnded(Transaction transaction, DbConnectionInternal transactedObject)
   at System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment enlistment)
   at System.Transactions.TransactionStateDelegatedCommitting.EnterState(InternalTransaction tx)
   at System.Transactions.CommittableTransaction.Commit()
   at System.Transactions.TransactionScope.InternalDispose()
   at System.Transactions.TransactionScope.Dispose()
   //... continues here with references to my DAL code

この例外が発生する理由は何ですか?

私はすでにこれについていくつかの研究を行っていますが、まだ具体的な成功はありません. ここでこの質問も読みました:

そして今、トランザクションを DTC にエスカレートすることを避けることができれば、この問題を解決できることがわかりました。でも、できなかったら?1 つのトランザクションで複数のデータベースを更新または読み取る必要があるため、DTC を使用する必要があります。通常はうまく機能するアクションで、このエラーが時々発生します。

技術的背景

  • .NET 3.5 上の ASP MVC2 および LINQ2SQL アプリケーションです。
  • IP アドレスに基づいて負荷分散を行う 3 つの仮想があり、それぞれに IIS7 があります。
  • SQL サーバー 2008 との単一の仮想 - Web サーバーによって共有されます

開発マシン (開発サーバー + SQL Express 2008) とテスト マシン (単一の IIS7 と SQL サーバー 2008 を組み合わせた仮想マシン) でも、この例外を再現できなかったことを指摘しておく必要があります。

実稼働サーバーの構成にスレッド化/処理の問題があるのではないかと疑っています (2 つのプロセスが同じ接続を使用しようとしているなど)。

アップデート

別のリンクを見つけました。ado.net 接続破棄バグが戻ってきた可能性が高いと述べています。しかし、最終的に解決策がないのは残念であり、同様の問題を説明している人は他にいません。

4

3 に答える 3

1

.NET 内部コードであるため、バグのように見えます。独自のコードとは関係ありません。

内部メソッドでリフレクター (またはその他の IL ツール) をTransactedConnectionPool.TransactionEnded調べると、その実装が .NET 3 と .NET 4 の間で変更されていることがわかります...当時はスレッドセーフではなかったと思います。Microsoft Connectに報告してみてください。

于 2012-11-12T16:20:38.867 に答える
0

doco MSDN System.Transactions.TransactionScopeによると、メソッドは同期的であるため、モニターを使用しています。doco はメソッドがスレッドセーフであるとは言っていないので、複数のスレッドから同じ Transaction スコープ オブジェクトに対して dispose を呼び出している可能性が高いと思います。transactionscope オブジェクトの静的プロパティを使用して、System.Transactions.Transaction.Current参照しているトランザクションを見つけることができます。おそらく、トランザクションスコープを破棄する前のログメッセージにより、これが発生している場所が明らかになる可能性があります...

スレッドの問題でない場合は、.Net のバグを引き起こすまれなケースを発見した可能性があります。問題が発生したときの MSDTC の動作は、せいぜい不快なものであることがわかりました。

于 2012-11-12T14:17:29.597 に答える