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作为隔离级别).