Время от времени я получаю это исключение на нашем рабочем сервере:
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
Какова причина возникновения этого исключения?
Я уже провел некоторое исследование по этому поводу, но пока без особого успеха. Я также читал эти вопросы здесь:
- Intermittent System.ArgumentNullException с использованием TransactionScope
- TransactionScope автоматически расширяется до MSDTC на некоторых машинах?
И теперь я знаю, что если бы я мог избежать передачи моих транзакций в DTC, я бы избавился от этой проблемы. Но что, если я не смогу? У меня есть несколько баз данных, которые нужно обновить или прочитать за одну транзакцию, поэтому я должен использовать DTC. Я получаю эту ошибку иногда при действиях, которые обычно работают хорошо.
Техническая подготовка
- Это приложение ASP MVC2 и LINQ2SQL на .NET 3.5.
- У нас есть три виртуальных машины с балансировкой нагрузки по IP-адресу, каждая из которых имеет IIS7.
- Единый вирутал с SQL server 2008 - он используется веб-серверами
Я должен отметить, что мне не удалось воспроизвести это исключение на моей машине разработки (сервер разработки + SQL Express 2008) и на нашей тестовой машине (виртуальной с одним IIS7 и SQL server 2008 вместе).
Я подозреваю, что в конфигурации наших производственных серверов есть проблема с потоками / обработкой (например, два процесса пытаются использовать одно и то же соединение).
ОБНОВЛЕНИЕ
Нашел другую ссылку. В нем говорится, что ошибка удаления соединения ado.net, вероятно, вернулась. Но жаль, что в итоге нет разрешения, и я не нашел никого, кто описывал бы подобную проблему.