Проблемы с connection pool и уровнями изоляции транзакций

Базы данных  /  Внезапно dotNET  /  MSSQL

Продолжаю тему, начатую ранее про дырявые абстракции и TransactionScope. Сегодня ещё одна короткая заметка из категории “Внезапно” и снова про уровни изоляции.

Знаете ли вы, какой будет уровень изоляции, когда вы откроете соединение (для определённости — SqlConnection)? Вопрос с подвохом. Правильный ответ, как обычно — It depends.

Дело в том, что, чаще всего, вы используете connection pool. А он, при возврате в пул и извлечении из него соединения не меняет уровень изоляции. На эту тему есть статья (KB 972915), которая говорит что это “by desing”.

Что тут можно сказать — будьте бдительны :) В принципе, если у вас всегда один уровень изоляции, вы в относительной безопасности. А чаще всего так и бывает — мало кто задумывается об уровнях изоляции, отличных от дефолтных. А вот если уровней может быть несколько — лучше их указывать явно всегда (одним из способов, перечисленных в KB).

Из забавного. В MSSQL 2014 это поведение починили, но потом спохватились и назвали такое изменение поведения ошибкой.

Базы данных  /  Внезапно dotNET  /  MSSQL