Тайм-аут TransactionScope происходит преждевременно? - PullRequest
7 голосов
/ 28 мая 2011

Я использую TransactionScope для пакетной вставки и обновлений.Проблема в том, что я получаю исключения тайм-аута при 30-минутной операции, даже когда я устанавливаю тайм-аут TransactionScope на один час.

Также после исключения он вставляет, казалось бы, случайное количество записейпартия.Например, последняя операция имела 12440 вставок, и после таймаута в таблицу было вставлено 7673 записи.

Время ожидания SqlConnection и SqlCommand установлено на int.MaxValue.

Что я делаю не так?

Вот мой код:

using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1)))
 {
         try
         {
                using (db = new DB())
                {
                //operations here
                }
         }
         catch (Exception ex)
         {
               throw new Exception("DB Error:\r\n\r\n" + ex.Message);
         }

         transaction.Complete();
} // <--- Exception here: Transaction aborted (Inner exception: Timeout)

Ответы [ 2 ]

8 голосов
/ 31 мая 2011

Сбой вашей транзакции через 10 минут?Если это так, возможно, вы используете Максимальное время ожидания диспетчера транзакций , установленное в machine.config.Если я правильно помню, если вы попытаетесь установить тайм-аут, превышающий максимальное значение, то ваши настройки будут игнорироваться.Попробуйте увеличить значение в machine.config и посмотреть, поможет ли это вашей проблеме.

С точки зрения случайных фиксаций вы устанавливаете Transaction Binding=Explicit Unbind в строке подключения?Значение по умолчанию Transaction Binding=Implicit Unbind.Начиная с MSDN :

Неявное отсоединение приводит к отсоединению соединения от транзакции после ее завершения.После отсоединения дополнительные запросы на соединение выполняются в режиме автоматической фиксации.Свойство System.Transactions.Transaction.Current не проверяется при выполнении запросов, когда транзакция активна.После завершения транзакции дополнительные запросы выполняются в режиме автоматической фиксации.

В основном, когда время транзакции истекает, все вставки до этой точки будут откатываться, но любые дополнительные вставки, выполненные с использованием того же соединения, будутбыть сделано в режиме автоматической фиксации, где каждый оператор вставки будет немедленно зафиксирован.Это похоже на сценарий, который вы видите (но трудно понять, не увидев полный код / ​​репро).

2 голосов
/ 28 мая 2011

Я бы посмотрел, можно ли использовать SqlBulkCopy Class . Это должно быть намного быстрее и может устранить необходимость в длительном тайм-ауте.

...