Отметьте статью MSDN , в которой говорится:
Уровень изоляции имеет область действия для всего соединения и один раз устанавливается для
соединение с оператором SET TRANSACTION ISOLATION LEVEL, это
остается в силе до тех пор, пока не будет закрыто соединение или другая изоляция
уровень установлен. Когда соединение закрыто и возвращено в пул,
уровень изоляции от последнего УСТАНОВЛЕННОГО УРОВНЯ ИЗОЛЯЦИИ
Заявление сохраняется. Последующие соединения, повторно использующие объединенные
Соединение использовать уровень изоляции, который был в силе в то время, когда
соединение в пул.
Проблема заключалась в том, что соединение было открыто с Serializable уровнем изоляции; соответствующая транзакция была удалена, как и соединение, но соединение не было уничтожено и перешло в пул соединений. В следующий раз, когда был сделан запрос на соединение (с той же строкой соединения), само это соединение возвращалось, и, поскольку в запросе не был указан какой-либо уровень изоляции, он выполнялся на уровне изоляции Serializable.
По сути, если у вас есть пул соединений и вы открываете соединение с определенным уровнем изоляции, скажем, Serializable, то соединение вернется в пул с уровнем изоляции, установленным в Serializable. В следующий раз, когда вы запросите соединение, вы не можете быть уверены, что это соединение не будет возвращено, поэтому даже через уровень изоляции по умолчанию ReadCommitted вы можете получить одно из этих «Сериализуемых» соединений.
Еще одно предостережение: каждый раз, когда вы устанавливаете уровень изоляции Serializable (или что-либо еще в этом отношении), вы можете выбирать разные соединения, и постепенно вы можете загрязнять все больше и больше соединений в пуле соединений, устанавливая уровень изоляции Serializable. (или что вы установили).
Я не нашел никакого механизма для сброса одноразового соединения (когда оно возвращалось в пул соединений после выполнения моего запроса). Одним из обходных путей является явный сброс уровня изоляции для каждого соединения. Но это утомительно.
Таким образом, наилучшей альтернативой является создание отдельных пулов соединений для разных уровней изоляции .