Неявная транзакция System.Transaction связывается с другими моими соединениями - PullRequest
0 голосов
/ 04 декабря 2008

Я пытаюсь использовать System.Transaction.TransactionScope для создания транзакции для вызова нескольких хранимых процедур, но она, похоже, не очищается после себя. Как только транзакция завершена (зафиксировано или нет, а объект области транзакции удален), последующие соединения с базой данных открываются с уровнем фиксации чтения сериализуемого вместо зафиксированного чтения, как обычно.

Я открываю и закрываю соединение для каждого вызова (хорошо закрываю и возвращаюсь в пул соединений, как обычно в .NET), мне не хватает какого-либо способа явного сброса соединения, когда я использую его для сделка? Я думал, что идея System.Transaction.TransactionScope заключалась в том, чтобы скрыть всю сложность.

Итак, код, который у меня есть, выглядит следующим образом:

            using (var scope = new TransactionScope())
            {
                ... make my 3 stored procedure calls ...

                scope.Complete();

                return returnCode;
            }

что я думаю, это нормальный способ сделать это. Но тогда, если я загляну в sqlserver profiler, я увижу, что соединения открываются с

set transaction isolation level serializable

, который портит последующую не связанную с транзакциями активность базы данных, а также, по-видимому, не так быстро. Я могу обойти это, установив опцию транзакции в explicity, сделав транзакцию с ReadCommited, но это, на мой взгляд, не идеальное поведение для этой операции.

Я также пытался явно создать объект Commitabletransaction, создавая новые транзакции вместо использования окружающих, но все равно не повезло.

Любые идеи о том, как это исправить, будут высоко оценены, поскольку любые вызовы, использующие сериализуемое соединение, будут выдавать ошибку, если они попытаются использовать подсказку блокировки readpast.

Ответы [ 3 ]

1 голос
/ 04 декабря 2008

Использование TransactionOptions.IsolationLevel

По по умолчанию, он сериализуем

TransactionOptions transactionoptions1 = new TransactionOptions();
transactionoptions1.IsolationLevel = IsolationLevel.ReadCommitted;
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionoptions1))
{
    ... make my 3 stored procedure calls ...

    scope.Complete();

    return returnCode;
}
0 голосов
/ 20 июля 2012

Это известное проектное решение в SQL Server.

Также, с использованием нового TransactionScope () Считается вредным (06/2010; избегать конструктора по умолчанию)

0 голосов
/ 04 декабря 2008

Вы также должны увидеть сброс (sp_reset_connection) между использованиями одного и того же соединения в пуле; это не сбросит уровень изоляции? Вы пытались воспроизвести сериализуемую проблему (например, блокировку при эскалации блокировки)

...