TransactionScope и организация пула подключений

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

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

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

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

Graham

9
задан ChrisV 14 March 2010 в 22:30
поделиться

1 ответ

Это тревожно!

В статье Билла Вогана, на которую вы ссылаетесь, говорится, что "...каждый 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" в строку подключения.

7
ответ дан 3 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: