TimeoutException problems.TransactionScope TransactionAborted Exception - BeginCommit()?
Контекст: Visual Studio 2010
Проблема: Я иногда (примерно один раз в день на программу, которая проходит один раз в час) получаю исключение , что я не понимаю.
Это исключение:
Exception message : The transaction has aborted.
Exception Source : System.Transactions
Exception 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()
at JDTranslation_K4_ReadEmails.Form1.ReadEmailDetails(EmailMessage emMessage, String strUserName, String strAccountName)
Exception Target : Void BeginCommit(System.Transactions.InternalTransaction, Boolean, System.AsyncCallback, System.Object)
Исключение происходит, как правило, после операции, которая длилась 25-30 минут.
Я установил свою транзакцию в течение последних 5 часов (см. Ниже), поэтому я совершенно не понимаю, почему можно тайм-аут.
И меня несколько беспокоит: я знаю, что некоторые данные привязаны к базе данных . Могу ли я доверять, что все они есть? (Это почти невозможно проверить с помощью исследования данных.)
Программы (часть функции) выглядит примерно так:
//INSTANTIATE THE TRANSACTION SCOPE
TransactionOptions option = new TransactionOptions();
//SET THE ISOLATION LEVEL AND THE TIMEOUT DURATION
option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
option.Timeout = new TimeSpan(5, 0, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
{
try{
// do some select/update/insert/delete stuff on both connections,
// up to perhaps 3600 actions
// some of it happens in static functions declared elsewhere in the same class scope
} // this is the line mentioned in the Exception
}
Я буду рад любым ответы на некоторые из моих вопросов :
Почему происходит исключение?
Могу ли я доверять тому, что все данные зафиксированы, или есть реальная ошибка в C# .NET, которая допускает частичные коммиты?
Является ли мой код правильным, или я должен организовать его по-другому, чтобы обойти проблему?
Пожалуйста, помогите!