(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;
}
ОБНОВЛЕНИЕ:
Проблема не решена полностью, но дополнительная информация, если у кого-то еще возникнет эта проблема.
Я чувствую, что предстоит перестройка базы данных и переосмысление некоторых бизнес-функций ...