Эта статья статьи MSDN гласит, что:
Уровень изоляции имеет общий доступ область действия и один раз для подключения с изоляцией SET TRANSACTION LEVEL, он остается в силе пока соединение не будет закрыто или устанавливается другой уровень изоляции. Когда соединение закрывается и возвращается пул, уровень изоляции от последний УРОВЕНЬ ИЗОЛЯЦИИ УСТРОЙСТВА СТАВКИ утверждение сохраняется. последующее соединения, использующие объединенные подключение использует уровень изоляции который действовал в то время, когда соединение объединено.
Класс SqlConnection не имеет члена, который может удерживать уровень изоляции. Итак, как соединение знает, какой уровень изоляции запускать?
Причина, по которой я спрашиваю об этом, связана со следующим сценарием:
- Я открыл транзакцию, используя TransactionScope в Serializable режиме, скажем, "T1".
- Открыл соединение для T1.
- T1 завершен/удален, соединение возвращается в пул соединений.
- Вызов другого запроса на тот же соединение (после получения пул соединений), и этот запрос выполняется в сериализованном режиме!!!
Проблема:
- Как работает объединенное соединение знать, какой уровень изоляции был связанные с ним???
- Как вернуть его обратно уровень транзакции
Разрешение:
Причина, по которой объединенные соединения возвращают сериализуемый уровень изоляции, объясняется следующей причиной:
- У вас есть один пул соединений (скажем, CP1)
- CP1 может иметь 50 подключений.
- Вы выбираете одно соединение C1 из CP1 и выполняете его с помощью Serializable. Теперь это соединение имеет уровень изоляции. Что бы вы ни делали, это не будет reset (если это соединение не будет используется для выполнения кода на другом уровне изоляции).
- После выполнения запроса C1 (Serializable) возвращается к CP1.
- Если шаги 1-4 выполняются снова, тогда используемое соединение может быть каким-то другим соединением, чем C1, пусть C2 или C3. Таким образом, это также будет установите уровень изоляции на Serializable.
- Итак, медленно, Serialzable устанавливается на несколько соединений в CP1.
- Когда вы выполняете запрос, где не выполняется явная настройка уровня изоляции, соединение, выбранное из CP1, будет определять уровень изоляции. Напр. если такой запрос запрашивает соединение и CP1 использует C1 (Serializable) для выполнения этого запроса, затем этот запрос будет выполняться в режиме Serializable, даже если вы явно не указали установите его.
Надеюсь, что устраняются несколько сомнений.:)