Как вложенные транзакции работают с триггерами и разными уровнями изоляции на сервере SQL? - PullRequest
2 голосов
/ 28 мая 2020

Мне нужно ответить на два вопроса. Вот обзор:

У меня есть 3 таблицы:

CREATE TABLE A(x INT)
CREATE TABLE B(x INT)
CREATE TABLE C(x INT)

и 2 триггера:

ALTER TRIGGER ATr ON A
FOR INSERT AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

    INSERT INTO B 
        SELECT * 
        FROM inserted;
    COMMIT
END

ALTER TRIGGER BTr ON B
FOR INSERT AS
BEGIN
    INSERT INTO C 
        SELECT * FROM inserted;
END

и INSERT, запускающий триггер ATr INSERT INTO A VALUES(3), выполняется на Уровень изоляции REPEATABLE READ, а уровень изоляции по умолчанию для этой базы данных - READ COMMITTED.

И мне нужно ответить на два вопроса:

  • На каком уровне изоляции будет выполняться триггер ATr?
  • На каком уровне изоляции будет выполняться триггер BTr (если вообще)?

У меня проблемы с пониманием того, как эти вложенные транзакции будут работать. Будет ли когда-либо выполняться какая-либо транзакция внутри транзакции LEVEL SERIALIZABLE? Они вообще в этом случае вложены? Что произойдет, если более низкий уровень изоляции находится внутри более высокого уровня изоляции или наоборот?

1 Ответ

0 голосов
/ 28 мая 2020

Это поведение описано здесь. SET TRANSACTION ISOLATION LEVEL

И вы можете проверить это поведение, запустив

select CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncomitted'
WHEN 2 THEN 'ReadCommitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS transaction_isolation_level
from sys.dm_exec_requests
where session_id = @@spid 

в любом месте, где вас интересуют текущие активные уровень изоляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...