Какова область изоляции вложенных транзакций в SQL Server?

Рассмотрим следующий 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. Это верно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
5 541
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не думаю, что это правильно.

См. Примечания здесь: Установить транзакцию

Only one of the isolation level options can be set at a time, and it remains set for that connection until it is explicitly changed.

Вы [Боб Пробст] правы. Интересно, что согласно документация вы связали:

If you issue SET TRANSACTION ISOLATION LEVEL in a stored procedure or trigger, when the object returns control the isolation level is reset to the level in effect when the object was invoked. For example, if you set REPEATABLE READ in a batch, and the batch then calls a stored procedure that sets the isolation level to SERIALIZABLE, the isolation level setting reverts to REPEATABLE READ when the stored procedure returns control to the batch.

Итак, суть в том, что SET TRANSACTION ISOLATION LEVEL имеет родство процедуры, а не привязка транзакции (как я думал).

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

Ну это отстой, лол! Мой API базы данных C# имеет тенденцию принимать открытые объекты соединения, поэтому я могу вызывать несколько функций, не открывая каждый раз новое соединение. Это отсутствие «сродства транзакции» означает, что если я вызываю один метод API базы данных из другого, и оба используют транзакцию, вложенная транзакция может изменить уровень изоляции транзакции транзакции вызывающей стороны. Определенно отстой. ВОЗМОЖНОЕ РЕШЕНИЕ ... для любого метода C#, который использует транзакцию, имитируйте процедурное сходство для транзакций C# с кодом C#, сохраняя уровень изоляции (dbcc useroptions) и восстанавливая его перед возвратом!

Triynko 30.08.2009 08:49

Этот «ответ» должен был быть комментарием. Но дай мне передохнуть. Это был 2008 год. :)

Gregory Higley 13.08.2017 21:48

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