TransactionScope и пул соединений - PullRequest
9 голосов
/ 11 марта 2010

Я пытаюсь выяснить, есть ли у нас проблема в нашем приложении с подключениями к базе данных, использующими неправильные IsolationLevels. Наше приложение представляет собой приложение базы данных .Net 3.5, использующее SQL Server 2005.

Я обнаружил, что IsolationLevel соединений не сбрасывается, когда они возвращаются в пул соединений (см. здесь ), и также был очень удивлен, прочитав это сообщение в блоге что каждому новому созданному TransactionScope назначается собственный пул соединений.

Обновления нашей базы данных (через наши бизнес-объекты) выполняются в TransactionScope (новый создается для каждого обновления графа бизнес-объекта). Но наши выборки не используют явную транзакцию. Так что мне интересно, можем ли мы когда-нибудь попасть в ситуацию, когда наши операции извлечения (которые должны использовать IsolationLevel по умолчанию - Read Committed) будут повторно использовать соединение из пула, который использовался для обновления, и наследовать обновление IsolationLevel (RepeatableRead)? Или наши обновления гарантированно будут использовать другой пул соединений, если посмотреть, как они заключены в TransactionScope?

Заранее спасибо,

Graham

Ответы [ 2 ]

7 голосов
/ 15 марта 2010

Это беспокоит!

В статье Билла Вогана, на которую вы ссылаетесь, говорится, что «... каждый TransactionScope получает свой собственный пул», но код в статье поддержки, на которую вы ссылаетесь, предполагает, что это не так, поскольку второй запуск NoTxScope() получает подключение из пула, который использовал повышенный уровень изоляции.

Вы можете «форсировать» проблему с помощью [я рисую код из первой ссылки]:

static void ForceReadCommitedScope()
{
    TransactionOptions op = new TransactionOptions();
    op.IsolationLevel = IsolationLevel.ReadCommitted;
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew, op))
    {
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True;");
        SqlCommand com = new SqlCommand("select transaction_isolation_level from sys.dm_exec_sessions where (session_id = @@SPID)", con);
        con.Open();
        short level = (short)com.ExecuteScalar();
        Console.WriteLine("transaction_isolation_level : " + level.ToString());
        con.Close();
        tx.Complete();
    }
}

или добавив "..;Pooling=False" в строку подключения.

3 голосов
/ 04 сентября 2014

В SQL Server 2014 уровень изоляции для соединения в пуле сбрасывается при возврате соединения в пул. В более ранних версиях это не так.

Смотрите это сообщение на форуме:

"в SQL 2014, для драйверов клиентов с версией 7.3 TDS или выше, сервер SQL сбрасывает уровень изоляции транзакции по умолчанию (чтение зафиксировано) для подключений в пуле. Для клиентов с версией TDS ниже 7.3 они будут иметь старое поведение при работе с SQL 2014. "

Обновление

Это исправление снова вернулось к предыдущему поведению в SQL 2014 CU6 и SQL 2014 SP1 CU1 с этим исправлением:

ИСПРАВЛЕНИЕ: Уровень изоляции транзакции сбрасывается неправильно, когда соединение SQL Server выпущено в SQL Server 2014

"Предположим, что вы используете класс TransactionScope в клиентском исходном коде SQL Server и не открываете явно соединение SQL Server в транзакции. Когда соединение SQL Server освобождается, уровень изоляции транзакции сбрасывается неправильно. «

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...