2011-09-21 45 views
2

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

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

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

回答

9

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

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

(编辑:刚才检查,这是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 
+0

感谢马丁。非常好的回答和解释。 – tgriffo

+0

+1这让我大开眼界......我可以发誓,我实际上看到了SQL Server如何运作BOL说的;我遇到了一个问题,一个存储过程将隔离级别提高到了可序列化,然后其他存储过程受到了影响,但我想这可能是应用程序坚持隔离级别而不是SQL Server。 –