Какова область изоляции во вложенных транзакциях в 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 имеет сходство процедур, а не сходство транзакций (как я думал).

Потрясающие!

Другие вопросы по тегам