Тайм-аут .NET TransactionScope / EF - PullRequest
4 голосов
/ 11 октября 2011

У меня есть проект WinForms, где я должен читать массивные xml-файлы (2 ГБ +) и хранить данные в базе данных MSSQL.Через 10 минут я получаю ошибку:«Транзакция, связанная с текущим соединением, завершена, но не была удалена. Транзакция должна быть удалена, прежде чем соединение можно будет использовать для выполнения операторов SQL».

Я полагал, что это должно быть проблемой тайм-аута, поэтомуЯ сделал следующее:

Я использую мой код:

using (tran = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
{
   IsolationLevel = System.Transactions.IsolationLevel.Serializable,
   Timeout = TimeSpan.Zero //TimeSpan.FromHours(2)
}))
{
    /*Here I read out xml, and use EF to write to DB*/
}

В свой App.config я добавил:

<system.transactions>
  <defaultSettings timeout="2:00:00"/>
</system.transactions>

В мой machine.config я добавил:

<system.transactions>
   <machineSettings maxTimeout="2:00:00"/>
</system.transactions>

И в MSSQL я устанавливаю тайм-аут удаленного запроса на 0

Тем не менее этот тайм-аут происходит.Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Я бы начал с того, что указывал, что такая массовая загрузка в одной транзакции из EF - это неправильно. Такая операция должна выполняться вне EF, например, с массовой вставкой во временную таблицу и объединением с основным набором данных.

Возможен также сценарий для служб SSIS (службы интеграции с SQL Server).

EF не является инструментом для миграции или синхронизации данных, и его производительность в таких сценариях трагична.

2 голосов
/ 11 октября 2011

Чтение XML-файла за пределами использования блока.

Я бы предложил использовать sqlcommand напрямую для вставки записей. Не используйте EF, поскольку требуется время для перевода объектов в записи.

Кроме того, я бы использовал SQLTransaction вместо области видимости. Хотя в области видимости будет использоваться sqltransaction, но у вас больше возможностей при использовании sqltrasnaction.

Мой код будет выглядеть как

...