Tsql 如何取消/重置SQL Server的事务隔离级别? 也许我误解了一些关于事务或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?

Tsql 如何取消/重置SQL Server的事务隔离级别? 也许我误解了一些关于事务或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?,tsql,sql-server-2008,transactions,isolation-level,Tsql,Sql Server 2008,Transactions,Isolation Level,也许这并不重要,但我喜欢那种温暖的模糊感觉,即一旦我完成了我正在做的事情,我就会让事情保持原样。是否可以将隔离级别重置回原始状态,而不考虑之前的状态 您可以从 如果需要跨批处理,则使用保留值,该值稍后也可以从sys.dm_exec_会话读取 DECLARE @CurrentIsolationLevel smallint SELECT @CurrentIsolationLevel = transaction_isolation_level FROM sys.dm_exec_sessions WH

也许这并不重要,但我喜欢那种温暖的模糊感觉,即一旦我完成了我正在做的事情,我就会让事情保持原样。是否可以将隔离级别重置回原始状态,而不考虑之前的状态

您可以从

如果需要跨批处理,则使用保留值,该值稍后也可以从sys.dm_exec_会话读取

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)

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

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

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

GBNs解决方案不适用于我。我怀疑它在其他地方会起作用

问题是,返回到以前的隔离级别仅在EXEC的上下文中有效。我的剧本在下面。请注意,如果当前隔离包括快照,它也不会尝试更改隔离。(如果你尝试,就会失败)


我的代码最终保存在一个存储过程中,所以很高兴知道这一点。谢谢@Damien_不信者这是否也适用于触发器?@spongebobcommrade-yes-:“如果在存储过程或触发器中发出设置事务隔离级别,当对象返回控制时,隔离级别将重置为调用对象时的有效级别”@Damien_不信者谢谢。太好了。
DECLARE @initalIsoloationLevel nvarchar(25)

SELECT @initalIsoloationLevel =
      CASE
          WHEN transaction_isolation_level = 1 
             THEN 'READ UNCOMMITTED' 
          WHEN transaction_isolation_level = 2 
               AND is_read_committed_snapshot_on = 1 
             THEN 'READ COMMITTED SNAPSHOT' 
          WHEN transaction_isolation_level = 2 
               AND is_read_committed_snapshot_on = 0 
             THEN 'READ COMMITTED' 
          WHEN transaction_isolation_level = 3 
             THEN 'REPEATABLE READ' 
          WHEN transaction_isolation_level = 4 
             THEN 'SERIALIZABLE' 
          WHEN transaction_isolation_level = 5 
             THEN 'SNAPSHOT' 
          ELSE NULL
       END 
FROM   sys.dm_exec_sessions AS s
WHERE  session_id = @@SPID

  /* Changing isolation level is not supported with snapshots */
IF @initalIsoloationLevel NOT LIKE '%SNAP%' AND @initalIsoloationLevel is NOT NULL
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;


/****** DO  YOUR  STUFF HERE   ******/


  /* Changing isolation level is not supported with snapshots */
IF @initalIsoloationLevel = 'READ COMMITTED'  
     SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ELSE IF @initalIsoloationLevel = 'REPEATABLE READ' 
     SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
ELSE IF @initalIsoloationLevel = 'SERIALIZABLE'
     SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;