SQL Server 2005事务级别和存储过程

tgr*_*ffo 2 .net t-sql transactions sql-server-2005

如果我使用该命令SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED然后使用EXEC storedProcedureName相同的上下文执行存储过程,那么存储过程是否会使用先前所述的事务级别或将使用默认的事务级别?

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

PS.:该系统建立在.NET 2.0和专有第三方产品之上,但有限制,因此需要这些解决方法.

Mar*_*ith 10

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

如果存储过程本身设置了显式隔离级别,则在存储过程退出时将重置该级别.

(编辑:刚刚检查过,这与BOL所说的相反 "......它仍然为该连接设置,直到明确更改为止"但可以从下面看到)

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
Run Code Online (Sandbox Code Playgroud)

结果

ReadUncomitted
Enter: SetRCTransLevel
Readcomitted
Exit: SetRCTransLevel
ReadUncomitted
Run Code Online (Sandbox Code Playgroud)