В этой статье MSDN говорится, что:
Уровень изоляции имеет область для всего соединения и однажды установлен для соединения с помощью SET TRANSACTION ISOLATION {{1 }} LEVEL, он остается в силе до тех пор, пока соединение не будет закрыто или не будет установлен другой уровень изоляции. Когда соединение закрывается и возвращается в пул, уровень изоляции из последнего оператора SET TRANSACTION ISOLATION LEVEL сохраняется. Последующие соединения, повторно использующие объединенное соединение , используют уровень изоляции , который действовал во время объединения соединения в пул.
Класс SqlConnection не имеет члена, который может содержать уровень изоляции. Итак, как соединение узнает, на каком уровне изоляции работать ???
Я спрашиваю об этом из-за следующего сценария:
Проблема:
Решение:
Причина, по которой объединенные соединения возвращают сериализуемый уровень изоляции, заключается в следующей причине:
- У вас есть один пул соединений (скажем, CP1)
- CP1 может иметь 50 подключений.
- Вы выбираете одно соединение C1 из CP1 и выполняете его с помощью Serializable. У этого соединения теперь установлен уровень изоляции. Что бы вы ни делали, это не будет сброшено (если это соединение не используется для выполнения кода на другом уровне изоляции).
- После выполнения запроса C1 (Serializable) возвращается к CP1.
- Если шаги 1–4 выполняются снова, то используемое соединение может быть другим соединением, отличным от C1, скажем, C2 или C3. Таким образом, уровень изоляции также будет установлен на Serializable.
- Итак, постепенно Serialzable настраивается на несколько подключений в CP1.
- Когда вы выполняете запрос, в котором не выполняется явная установка уровня изоляции, соединение, выбранное из CP1, будет определять уровень изоляции . Например, если такой запрос запрашивает соединение и CP1 использует C1 (Serializable) для выполнения этого запроса, тогда этот запрос будет выполняться в режиме Serializable, даже если вы явно не установили Это.
Надеюсь, что это рассеивает некоторые сомнения.:)