Как SqlConnection управляет IsolationLevel?

этоСтатья MSDN говорится, что:

Уровень изоляции имеет область действия всего соединения, и после установки для соединения с помощью инструкции SET TRANSACTION ISOLATION LEVEL он остается в силе до тех пор, пока соединение не будет закрыто или не будет установлен другой уровень изоляции. Когда соединение закрывается и возвращается в пул, уровень изоляции из последнего оператора SET TRANSACTION ISOLATION LEVEL сохраняется. Последующие соединения, повторно использующие объединенное в пул соединение, используют уровень изоляции, который действовал во время объединения в пул.

SqlConnection В классе нет члена, который может содержать уровень изоляции. Так как же соединение знает, на каком уровне изоляции работать?

Я спрашиваю об этом из-за следующего сценария:

Я открыл транзакцию, используя TransactionScope в режиме Serializable, скажем, «T1».Открыл соединение для Т1.T1 завершен / удален, соединение возвращается в пул соединений.Вызывается другой запрос на том же соединении (после получения его из пула соединений), и этот запрос выполняется в сериализуемом режиме !!!

Проблема:

Как объединенное соединение все еще знает, какой уровень изоляции был связан с ним ???Как вернуть его на какой-то другой уровень транзакции ???

Разрешение:
Причина, по которой объединенные в пул соединения возвращают сериализуемый уровень изоляции, заключается в следующей причине:

У вас есть один пул соединений (скажем, CP1)CP1 может иметь 50 соединений.Вы выбираете одно соединение C1 из CP1 и выполняете его с помощью Serializable. У этого соединения установлен уровень изоляции. Что бы вы ни делали, это не будет сброшено (если только это соединение не используется для выполнения кода на другом уровне изоляции).После выполнения запроса C1 (Serializable) возвращается к CP1.Если шаги 1-4 выполняются снова, тогда используемое соединение может быть чем-то другим, чем C1, скажем, C2 или C3. Таким образом, уровень изоляции также будет установлен на Serializable.Таким образом, Serialzable медленно устанавливается на несколько соединений в CP1.Когда вы выполняете запрос, в котором не выполняется явная настройка уровня изоляции, соединение, выбранное из CP1, будет определять уровень изоляции. Например, если такой запрос запрашивает соединение и CP1 использует C1 (Serializable) для выполнения этого запроса, тогда этот запрос будет выполняться в режиме Serializable, даже если вы явно не устанавливали его.

Надеюсь, что это проясняет некоторые сомнения. :)

Ответы на вопрос(4)

Ваш ответ на вопрос