存储过程在调用时将使用事务隔离。
如果存储过程本身设置了明确的隔离级别,则此存储过程退出时将被重置。
(编辑:刚才检查,这是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
感谢马丁。非常好的回答和解释。 – tgriffo
+1这让我大开眼界......我可以发誓,我实际上看到了SQL Server如何运作BOL说的;我遇到了一个问题,一个存储过程将隔离级别提高到了可序列化,然后其他存储过程受到了影响,但我想这可能是应用程序坚持隔离级别而不是SQL Server。 –