存储过程内设置事务隔离级别后,被调用的子存储过程是否沿用该级别?
存储过程嵌套调用的事务隔离级别继承问题解答
结论
你提供的示例代码中,SecondStoredProc内的SELECT查询会在SNAPSHOT隔离级别下运行。
规则说明
SQL Server 中SET TRANSACTION ISOLATION LEVEL属于会话级别的设置,在没有被显式覆盖的前提下,会作用于当前会话的所有执行逻辑,包括嵌套调用的下层存储过程、自定义函数、动态SQL语句。
只有两种场景会打破这个继承规则:
- 下层存储过程内部显式执行了
SET TRANSACTION ISOLATION LEVEL修改隔离级别:该修改仅在下层存储过程运行周期内生效,执行结束返回上层时,会自动恢复为上层存储过程设置的隔离级别 - 查询语句本身添加了表级隔离级别提示(例如
WITH (READCOMMITTED)):表提示的优先级高于会话级隔离级别设置,会覆盖全局配置
示例验证
你给出的代码中SecondStoredProc没有显式修改隔离级别,也没有添加表提示,因此会直接继承上层FirstStoredProc设置的SNAPSHOT隔离级别。
CREATE PROCEDURE [dbo].[FirstStoredProc] AS BEGIN SET TRANSACTION ISOLATION LEVEL SNAPSHOT EXEC [dbo].[SecondStoredProc] END; CREATE PROCEDURE [dbo].[SecondStoredProc] AS BEGIN SELECT name FROM sys.objects WHERE type = 'P'; END; EXEC FirstStoredProc
内容的提问来源于stack exchange,提问作者user3407335
相关产品推荐
相关产品推荐

