2013-08-09 4 views
1

Мы устанавливаем уровень изоляции для Read Uncommitted, как показано ниже.Сброс Уровень изоляции при использовании транзакции Scop

TransactionOptions to = new TransactionOptions(); 
    to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; 
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to)) 
    { 
     // Do Stuff 
     transaction.Complete(); 
    } 

Беда в том, когда соединение возвращается в пул он не получает сбросить обратно на уровень изоляции по умолчанию, который я понимаю, это дизайн (The transaction isolation level is not reset when you reuse a connection from the connection pool). Поэтому, когда транзакция завершается, все, что повторяет это соединение из пула, будет запущено с уровнем изоляции Read Uncommitted.

Я попытался позвонить "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" с помощью SqlCommand, но нет способа гарантировать, что он будет повторно использовать одно и то же соединение из пула. Ничто в // Do Stuff не предоставляет базовое соединение.

Есть ли способ сбросить уровень изоляции без явной настройки его во всех вызовах БД на случай, если этот код был запущен ранее?

ответ

1

I concerned myself with this problem a while ago. Короткий ответ: нет хорошего решения. Я считаю, что сейчас лучше всего выполнять все в рамках явной транзакции, поскольку это обеспечивает вам гарантированный уровень изоляции. Никогда не используйте неявные транзакции.

4

Я использовал бы другой connection string (возможно, тот, который устанавливает пул в ложь или просто скриптит с именем приложения) для соединений, которые вы используете в этой области транзакции. Таким образом, это соединение заканчивается (другим | нет) пулом для других соединений и не может случайно быть подхвачено другим кодом.

+0

Это подход, который мы используем. Что-то как «простое» как добавочное пространство сделает строку соединения «отличной» и, таким образом, попадет в другой пул. Код проверяет изоляцию окружающего пространства, чтобы определить, какую CS использовать. Это не идеально, но это лучше, чем ничего. – user2864740

Смежные вопросы