Какова область изоляции во вложенных транзакциях в SQL Server?
Рассмотрим следующий SQL:
НАЧАТЬ ТРАНС УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СДЕЛКИ СДЕЛКИ INSERT Bands (Название) ВЫБЕРИТЕ "Depeche Mode" UNION ВЫБЕРИТЕ "Аркадный огонь" - Я выделил внутреннюю транзакцию, чтобы сделать ее более понятной. НАЧАТЬ ТРАНС УСТАНОВИТЕ УРОВЕНЬ ИЗОЛЯЦИИ СДЕЛКИ СЧИТАЕТСЯ НЕОБЕСПЕЧЕННЫМ ВЫБРАТЬ * ОТ группы COMMIT - Какой уровень изоляции здесь? ОБНОВЛЕНИЕ Группы SET Name = 'Скромная Мышь' ГДЕ Имя = "Странный дом" COMMIT
В итоге мы запускаем транзакцию и устанавливаем уровень ее изоляции READ COMMITTED
, Затем мы делаем некоторый случайный SQL и запускаем другую вложенную транзакцию. В этой транзакции мы меняем уровень изоляции на READ UNCOMMITTED
, Затем мы фиксируем эту транзакцию и возвращаемся к другой.
Теперь я предполагаю, что после внутренней фиксации уровень изоляции возвращается к READ COMMITTED
, Это правильно?
2 ответа
Я не думаю, что это правильно.
Обратитесь к комментариям здесь: Установить транзакцию
Одновременно может быть установлен только один из параметров уровня изоляции, и он остается установленным для этого соединения, пока он не будет явно изменен.
Вы [Боб Пробст] правы. Интересно, что согласно документации, на которую вы ссылаетесь:
Если вы используете SET TRANSACTION ISOLATION LEVEL в хранимой процедуре или триггере, когда объект возвращает управление, уровень изоляции сбрасывается до уровня, действующего на момент вызова объекта. Например, если вы установили REPEATABLE READ в пакете, а затем пакет вызывает хранимую процедуру, которая устанавливает уровень изоляции SERIALIZABLE, настройка уровня изоляции возвращается в REPEATABLE READ, когда хранимая процедура возвращает управление пакету.
Итак, суть здесь в том, что SET TRANSACTION ISOLATION LEVEL имеет сходство процедур, а не сходство транзакций (как я думал).
Потрясающие!