SQL 服务器中的嵌套事务如何与触发器和不同的隔离级别一起工作?

How do nested transactions work with triggers and different isolation levels in SQL Server?

我需要回答两个问题。概述如下:

我有 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

并且触发 ATr 触发器 INSERT INTO A VALUES(3) 的插入是在可重复读取隔离级别上完成的,并且此数据库的默认隔离级别是已提交读取。

我需要回答两个问题:

我无法理解这些嵌套交易的运作方式。 LEVEL SERIALIZABLE 事务中的任何事务都会执行吗?它们甚至嵌套在这种情况下吗?如果较低的隔离级别在较高的隔离级别内或相反,会发生什么情况?

此处记录了该行为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 

无论您对当前活动的隔离级别感到好奇。