【问题标题】:When setting transaction level in a stored procedure, do the procs that get called stay at the same transaction level?在存储过程中设置事务级别时,被调用的过程是否保持相同的事务级别?
【发布时间】:2021-05-20 04:34:49
【问题描述】:

我试图确定在我的主调用存储过程下的存储过程以相同的事务隔离执行 级别。

例如,如果我设置SET TRANSACTION ISOLATION LEVEL 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

select 会在快照隔离下运行吗?

【问题讨论】:

  • 是的。轻松tested。请注意,如果SecondStoredProc 执行自己的SET TRANSACTION ISOLATION LEVEL,当我们返回FirstStoredProc 时,它将在退出时重置为SNAPSHOT

标签: sql sql-server


【解决方案1】:

它在调用过程的上下文中。要查看这一点,请将此行添加到 proc,SecondStoredProc:

dbcc useroptions;

最后一行会有一个隔离级别的条目。

【讨论】:

    【解决方案2】:

    我是从另一个 stackoverflow 问题中找到的。它确实保持其范围。

    ALTER PROCEDURE [dbo].[FirstStoredProc] 
    AS
    BEGIN
        SET TRANSACTION ISOLATION LEVEL SNAPSHOT
        SELECT 'PROC 1'
        DBCC USEROPTIONS;
    EXEC [dbo].[SecondStoredProc]
    END;
    ALTER PROCEDURE [dbo].[SecondStoredProc] 
    AS
    BEGIN
    --Select name from sys.objects where type = 'P';
    SELECT 'PROC 2'
    DBCC USEROPTIONS;
    END;
    
    DBCC USEROPTIONS;
    EXEC FirstStoredProc
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多