Какова область изоляции вложенных транзакций в SQL Server?
-
03-07-2019 - |
Вопрос
Рассмотрим следующий SQL:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED INSERT Bands ( Name ) SELECT 'Depeche Mode' UNION SELECT 'Arcade Fire' -- I've indented the inner transaction to make it clearer. BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Bands COMMIT -- What is the isolation level right here? UPDATE Bands SET Name = 'Modest Mouse' WHERE Name = 'Oddest House' COMMIT
Таким образом, мы запускаем транзакцию и устанавливаем ее уровень изоляции равным READ COMMITTED
.Затем мы выполняем некоторый случайный SQL-запрос и запускаем другую, вложенную транзакцию.В этой транзакции мы меняем уровень изоляции на READ UNCOMMITTED
.Затем мы фиксируем эту транзакцию и возвращаемся к другой.
Теперь, я предполагаю, что после внутренней фиксации уровень изоляции возвращается к READ COMMITTED
.Правильно ли это?
Решение
Я не думаю, что это правильно.
См. примечания здесь: Установить транзакцию р>
Только один уровень изоляции параметры могут быть установлены одновременно, и это остается установленным для этого соединения до это явно изменено.
Другие советы
Вы [Боб Пробст] правы.Интересно, что, согласно Документация вы связаны:
Если вы устанавливаете УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ в хранимой процедуре или триггере, когда объект возвращает управление, уровень изоляции сбрасывается до уровня, действовавшего при вызове объекта.Например, если вы задаете ПОВТОРЯЕМОЕ ЧТЕНИЕ в пакете, и пакет затем вызывает хранимую процедуру, которая устанавливает уровень изоляции в СЕРИАЛИЗУЕМОЕ, параметр уровня изоляции возвращается к ПОВТОРЯЕМОМУ ЧТЕНИЮ, когда хранимая процедура возвращает управление пакету.
Итак, суть здесь в том, что УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ имеет сходство с процедурой, не сходство с транзакцией (как я и думал).
Потрясающе!