Эта SqlTransaction завершена;он больше не пригоден для использования - PullRequest
5 голосов
/ 06 февраля 2011

Я использую Linq to SQL с SQL Server 2008 с пакетом обновления 2 (SP2), мое приложение WinForm .net 4 Я импортирую в SQL Server 200 000 записей.Я создаю объекты и прикрепляю их к текстовому тексту на «insertonsubmit».Затем я делаю "submitChanges" каждые 100 записей.У меня нет СДЕЛОК, что так всегда.

Я получаю эту ошибку

 "This SqlTransaction has completed; it is no longer usable." with stack
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()

На ровном месте.Эта ошибка не является последовательной, она может появиться после 10 000 записей, 27 200 записей или XXX записей.

Поскольку ошибка кажется случайной, я подумал, что это как-то связано со сборкой мусора ...

У кого-нибудь есть подсказка?

1 Ответ

2 голосов
/ 06 февраля 2011

SubmitChanges имеет неявную транзакцию. Проблема в том, что ваша транзакция истекает - вы просто делаете слишком много. Для строк 200k я бы использовал SqlBulkCopy в промежуточной таблице, а затем запустил команду или SPROC, чтобы переместить эти 200k в таблицу actual ; возможно, с этой командой / SPROC в транзакции.

SqlBulkCopy - это , предназначенный для этого сценария - это один непрерывный поток или необработанные данные TDS, а не циклические обходы, возможно, - и на стороне сервера он также оптимизирован (но Как следствие, вы должны использовать промежуточную таблицу или рискуете, что вставки не будут зарегистрированы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...