【问题标题】:SQL Server 2005 Transaction Level and Stored ProceduresSQL Server 2005 事务级别和存储过程
【发布时间】:2011-11-22 09:22:29
【问题描述】:

如果我使用命令SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,然后在同一上下文中使用EXEC storedProcedureName 执行存储过程,该存储过程将使用前面所述的事务级别还是将使用默认级别?

如果我想强制每个存储过程在事务级别使用,是否必须在代码顶部包含相同的语句 (SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED)?

PS.:该系统建立在 .NET 2.0 和具有限制的专有第三方产品之上,因此需要这些变通方法。

【问题讨论】:

    标签: .net sql-server-2005 tsql transactions


    【解决方案1】:

    存储过程在调用时将使用有效的事务隔离。

    如果存储过程本身设置了一个明确的隔离级别,这将在存储过程退出时被重置。

    (编辑:刚刚检查过,这是contrary to what BOL says“......它一直为该连接设置,直到它被明确更改”但可以从下面看到)

    CREATE PROC CheckTransLevel
    AS
    DECLARE @Result varchar(20)
    
    SELECT @Result = CASE transaction_isolation_level 
                            WHEN 0 THEN 'Unspecified' 
                            WHEN 1 THEN 'ReadUncomitted' 
                            WHEN 2 THEN 'Readcomitted' 
                            WHEN 3 THEN 'Repeatable' 
                            WHEN 4 THEN 'Serializable' 
                            WHEN 5 THEN 'Snapshot' 
                      END 
    FROM sys.dm_exec_sessions 
    WHERE session_id = @@SPID
    
    PRINT @Result
    
    GO
    CREATE PROC SetRCTransLevel
    AS
    PRINT 'Enter: SetRCTransLevel'
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    EXEC CheckTransLevel
    PRINT 'Exit: SetRCTransLevel'
    GO
    
    SET NOCOUNT ON
    
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
    EXEC CheckTransLevel
    
    EXEC SetRCTransLevel
    
    EXEC CheckTransLevel
    

    结果

    ReadUncomitted
    Enter: SetRCTransLevel
    Readcomitted
    Exit: SetRCTransLevel
    ReadUncomitted
    

    【讨论】:

    • +1 这让我大吃一惊……我可以发誓我确实看到了 SQL Server 按照 BOL 所说的方式运行;我遇到了一个问题,其中一个存储过程将隔离提高到可序列化,然后其他存储过程受到影响,但我猜可能是应用程序保持了该隔离级别,而不是 SQL Server。
    • 文档实际上确实描述了这种行为(不幸的是,它在后面的段落中,并且它可能已在中间的〜6.5年内添加):如果您在存储过程中发出 SET TRANSACTION ISOLATION LEVEL或触发器,当对象返回控制时,隔离级别将重置为调用对象时生效的级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多