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

В этой статье MSDN говорится, что:

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

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

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

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

Проблема:

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

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

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

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

21
задан Sidharth Panwar 13 July 2012 в 08:27
поделиться