У меня есть приложение, которое потенциально делает тысячи вставок в базу данных SQL Server 2005. Если сбой по какой-либо причине невозможен (ограничение внешнего ключа, длина поля и т.д.), Приложение предназначено для регистрации ошибки вставки и продолжения.
Каждая вставка не зависит от других, поэтому транзакции не нужны для целостности базы данных. Однако мы хотим использовать их для повышения производительности. Когда я использую транзакции, мы получим следующую ошибку примерно на 1 из каждых 100 коммитов.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
Чтобы попытаться отследить причину, я поместил инструкции трассировки при каждой операции транзакции, чтобы я мог убедиться, что транзакция не была закрыта перед вызовом commit. Я подтвердил, что мое приложение не закрывает транзакцию. Затем я снова запустил приложение, используя те же самые входные данные, и он преуспел.
Если я выключу регистрацию, он снова сработает. Верните его, и он преуспеет. Это включение/выключение осуществляется через app.config без необходимости перекомпиляции.
Очевидно, что действие регистрации меняет время и заставляет его работать. Это указывает на проблему с потоками. Однако мое приложение не многопоточно.
Я видел одну запись MS KB, указывающую на ошибку с. framework 2.0 framework, которая может вызвать подобные проблемы (http://support.microsoft.com/kb/912732). Однако исправление, которое они предоставили, не решает эту проблему.