実稼働サーバーでこの例外が発生することがあります。
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
この例外が発生する理由は何ですか?
私はすでにこれについていくつかの研究を行っていますが、まだ具体的な成功はありません. ここでこの質問も読みました:
- TransactionScope を使用した断続的な System.ArgumentNullException
- 一部のマシンでは、TransactionScope が自動的に MSDTC にエスカレートしますか?
そして今、トランザクションを DTC にエスカレートすることを避けることができれば、この問題を解決できることがわかりました。でも、できなかったら?1 つのトランザクションで複数のデータベースを更新または読み取る必要があるため、DTC を使用する必要があります。通常はうまく機能するアクションで、このエラーが時々発生します。
技術的背景
- .NET 3.5 上の ASP MVC2 および LINQ2SQL アプリケーションです。
- IP アドレスに基づいて負荷分散を行う 3 つの仮想があり、それぞれに IIS7 があります。
- SQL サーバー 2008 との単一の仮想 - Web サーバーによって共有されます
開発マシン (開発サーバー + SQL Express 2008) とテスト マシン (単一の IIS7 と SQL サーバー 2008 を組み合わせた仮想マシン) でも、この例外を再現できなかったことを指摘しておく必要があります。
実稼働サーバーの構成にスレッド化/処理の問題があるのではないかと疑っています (2 つのプロセスが同じ接続を使用しようとしているなど)。
アップデート
別のリンクを見つけました。ado.net 接続破棄バグが戻ってきた可能性が高いと述べています。しかし、最終的に解決策がないのは残念であり、同様の問題を説明している人は他にいません。