Соединение DataContext закрыто или транзакция неожиданно завершилась при отправке изменений в транзакции TransactionScope? - PullRequest
1 голос
/ 22 ноября 2011

Код

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», в котором я не уверен, является ли это причиной проблемы или ее побочным эффектом.

1 Ответ

1 голос
/ 22 ноября 2011

Ничего себе, максимальное время ожидания ограничено machine.config: http://forums.asp.net/t/1587009.aspx/1

"ОК, мы решили эту проблему. Очевидно, среда .net 4.0 не позволяет вам настроить область транзакцийтайм-ауты в коде, как мы делали в прошлом, нам пришлось внести изменения в machine.config, добавив


в файл machine.config. При использовании инфраструктуры 2.0 нам не нужно было делать эти записи, так как наш код переопределялзначение по умолчанию для начала. "

Кажется, что тайм-аут, который вы установили в конструкторе TransactionScope, игнорируется или игнорируется настройкой максимального времени ожидания в файле machine.config.Об этом нет упоминания в документации для конструктора TransactionScope, который принимает параметр тайм-аута: http://msdn.microsoft.com/en-us/library/9wykw3s2.aspx

Это заставляет меня задуматься, что, если бы это была среда общего хостинга, с которой я имел дело, где я мог бынет доступа к файлу machine.config?В действительности нет способа разорвать транзакцию, поскольку она включает в себя создание данных в нескольких таблицах со связями и столбцами идентификаторов, значения которых автоматически увеличиваются.Какое плохое дизайнерское решение.Если это предназначалось для защиты серверов с общим хостингом, это бессмысленно, потому что такая длительная транзакция была бы изолирована только для моей собственной базы данных.Кроме того, если программа указывает более длительное время ожидания, то она, очевидно, ожидает, что транзакция займет больше времени, поэтому ее следует разрешить.Это ограничение - просто бессмысленный недостаток ИМО, который может вызвать проблемы.Смотрите также: TransactionScope MaximumTimeout

...