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)
的插入是在可重复读取隔离级别上完成的,并且此数据库的默认隔离级别是已提交读取。
我需要回答两个问题:
- ATr 触发器将在哪个隔离级别上执行?
- BTr 触发器将在哪个隔离级别上执行(如果有的话)?
我无法理解这些嵌套交易的运作方式。 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
无论您对当前活动的隔离级别感到好奇。
我需要回答两个问题。概述如下:
我有 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)
的插入是在可重复读取隔离级别上完成的,并且此数据库的默认隔离级别是已提交读取。
我需要回答两个问题:
- ATr 触发器将在哪个隔离级别上执行?
- BTr 触发器将在哪个隔离级别上执行(如果有的话)?
我无法理解这些嵌套交易的运作方式。 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
无论您对当前活动的隔离级别感到好奇。