Код
double timeout_in_hours = 6.0;
MyDataContext db = new MyDataContext();
using (TransactionScope tran = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions(){ IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted, Timeout=TimeSpan.FromHours( timeout_in_hours )}, EnterpriseServicesInteropOption.Automatic ))
{
int total_records_processed = 0;
foreach (DataRow datarow in data.Rows)
{
//Code runs some commands on the DataContext (db),
//possibly reading/writing records and calling db.SubmitChanges
total_records_processed++;
try
{
db.SubmitChanges();
}
catch (Exception err)
{
MessageBox.Show( err.Message );
}
}
tran.Complete();
return total_records_processed;
}
Пока работает приведенный выше код, он успешно завершает 6 или 7 сотен итераций цикла.Однако через 10–20 минут блок перехвата выше обнаруживает следующую ошибку:
{"Транзакция, связанная с текущим соединением, завершена, но не была удалена. Транзакция должна бытьрасположены перед тем, как соединение может быть использовано для выполнения операторов SQL. "}
Вызов tran.Complete никогда не выполняется, так почему он говорит, что транзакция, связанная с соединением, завершена?
Почему после успешной отправки сотен изменений соединение, связанное с DataContext, внезапно переходит в закрытое состояние?(Это еще одна ошибка, которую я иногда получаю здесь).
При профилировании SQL Server во время его работы выполняется только множество последовательных операций выбора и вставки, в которых больше ничего нет.Самое последнее, что ловит профилировщик, - это внезапный «Audit Logout», в котором я не уверен, является ли это причиной проблемы или ее побочным эффектом.