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?
也许这并不重要,但我喜欢那种温暖的模糊感觉,即一旦我完成了我正在做的事情,我就会让事情保持原样。是否可以将隔离级别重置回原始状态,而不考虑之前的状态 您可以从 如果需要跨批处理,则使用保留值,该值稍后也可以从sys.dm_exec_会话读取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
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;