如何取消/重置SQL Server的事务隔离级别?

aar*_*ona 12 t-sql transactions isolation-level sql-server-2008

也许我误解了有关事务或SQL Server正在做什么的事情,但考虑以下T-SQL:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO

BEGIN TRANSACTION

-- DO SOME READS AND OTHER THINGS

COMMIT

-- OK, WHAT HAPPENS TO THE ISOLATION LEVEL AFTER THIS?
Run Code Online (Sandbox Code Playgroud)

也许这没关系,但我喜欢温暖模糊的感觉,一旦我完成了我正在做的事情,我就会像往常一样离开事物.无论之前的状态如何,是否可以将隔离级别重置回原始状态?

gbn*_*gbn 15

你知道目前的水平 sys.dm_exec_sessions.transaction_isolation_level

如果需要跨越批次,则使用SET CONTEXT_INFO保留值,以后也可以从sys.dm_exec_sessions中读取该值.

DECLARE @CurrentIsolationLevel smallint

SELECT @CurrentIsolationLevel = transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION
-- DO SOME READS AND OTHER THINGS
COMMIT

DECLARE @SQL varchar(200)
SELECT @SQL = 'SET TRANSACTION ISOLATION LEVEL ' +
       CASE  @CurrentIsolationLevel
           WHEN 1 THEN 'READ UNCOMMITTED'
           WHEN 2 THEN 'READ COMMITTED'
           WHEN 3 THEN 'REPEATABLE READ'
           WHEN 4 THEN 'SERIALIZABLE'
           WHEN 5 THEN 'SNAPSHOT'
       END
EXEC (@sql)
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 13

如果您的代码在存储过程中执行,则更改仅适用于存储过程的范围 - 当存储过程返回时,连接的隔离级别将自动恢复为其先前级别:

create procedure dbo.IsoTest
as
    set transaction isolation level serializable
    begin transaction

    select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID

    select object_id from sys.objects

    commit
go
select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID
exec dbo.IsoTest
select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID
Run Code Online (Sandbox Code Playgroud)

(忽略来自sys.objects的结果集,这将输出2,4和2作为隔离级别).