TransactionScope TransactionAborted Exception - транзакция не откатывается. Должно быть?

(SQL SERVER 2008) Если в TransactionScope (.Complete ()) возникает ошибка времени ожидания транзакции, следует ли ожидать отката транзакции?

Обновление:
Фактически ошибка возникает в закрывающей фигурной скобке (т.е. .Dispose ()), а не .Complete (). Полная ошибка:

The transaction has aborted. System.Transactions.TransactionAbortedException TransactionAbortedException System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
   --- End of inner exception stack trace ---
   at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
   at System.Transactions.CommittableTransaction.Commit()
   at System.Transactions.TransactionScope.InternalDispose()
   at System.Transactions.TransactionScope.Dispose()

Насколько я могу судить, транзакция не откатывалась, и таблицы оставались заблокированными до тех пор, пока я не выдал KILL для SPID / session_id.

Я использовал DBCC OPENTRAN, чтобы получить самую старую транзакцию, а затем ЗАКОНЧИТЬ ее. Я попытался УБИТЬ СО СТАТУСОМ, но получил сообщение о том, что статус недоступен, поскольку ничего не откатывается. Статус SPID / session_id в sys.dm_exec_sessions - «спящий». Фрагмент кода:

try
{            
    using (var transaction = new TransactionScope())
    {
        LOTS OF WORK CARRIED OUT WITH LINQ ENTITIES/SubmitChanges() etc.
        transaction.Complete();  //Transaction timeout
    }
    return result;
}
catch (Exception ex)
{
    logger.ErrorException(ex.Message, ex);
    result.Fail(ex.Message);
    return result;
}

ОБНОВЛЕНИЕ:
Проблема не решена полностью, но дополнительная информация, если у кого-то еще возникнет эта проблема.

  1. Я использую LINQ to SQL и в области транзакции вызываю context.SubmitChanges (). Выполняю много вставок. Профилировщик SQL Server указывает, что для каждой вставки выдается отдельный оператор INSERT.
  2. В процессе разработки, если я сплю поток на 60 секунд (время ожидания TransactionScope по умолчанию составляет 60 секунд) ПЕРЕД вызовом SubmitChanges (), я получаю другую ошибку при вызове TransactionScope.Complete () (Операция недействительна для состояния транзакции.)
  3. Если я сплю 60 секунд ПОСЛЕ .SubmitChages () и непосредственно перед .Complete (), я получаю «Транзакция была прервана - System.TimeoutException: Transaction Timeout»
  4. ПРИМЕЧАНИЕ, однако, на моем компьютере разработчика не обнаружено открытых транзакций при использовании DBCC opentran - этого и следовало ожидать, поскольку вы ожидали отката транзакции.
  5. Если я затем добавлю код внизу этого вопроса (извините, не удалось заставить веб-сайт вставить его сюда) в свой файл конфигурации, который увеличивает время ожидания TransactionScope до 2 минут, все снова начинает работать (исследования показывают, что если это не так не работает, может быть параметр в machine.config ниже, чем это имеет приоритет).
  6. Хотя это остановит прерывание транзакции из-за характера обновлений, это означает, что блокировки основной бизнес-таблицы могут длиться до 2 минут, поэтому другие команды выбора, использующие тайм-аут SqlCommand по умолчанию, равный 30 секундам, будут отключены. Не идеально, но лучше, чем открытая транзакция, которая сидит там и полностью задерживает приложение.
  7. Несколько дней назад у нас был катастрофический выпуск, который означал, что у нас закончилось дисковое пространство в середине обновления (!), Поэтому мы в конечном итоге использовали сжатие функциональность базы данных, которая, очевидно, может вызвать проблемы с производительностью после того, как вы ее использовали.
  8. Я чувствую, что предстоит перестройка базы данных и переосмысление некоторых бизнес-функций ...

16
задан david.s 21 January 2013 в 14:05
поделиться