如何找到当前的交易水平?


Answers:


253

运行这个:

SELECT CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'ReadUncommitted' 
WHEN 2 THEN 'ReadCommitted' 
WHEN 3 THEN 'Repeatable' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID

docs.microsoft.com参考中的常量值


8
如果隔离级别为“ read_commited_snapshot”,则此错误不正确。在这种情况下,它将仅显示“ Readcommited”。
GaTechThomas

8
@GaTechThomas,READ_COMMITTED_SNAPSHOT不是隔离级别,它是数据库的选项,允许更改整个ReadDCommitted数据库的隔离级别的行为
Gennady VaninГеннадийВанин2013年

@GaTechThomas,然后如何查找该READ_COMMITTED_SNAPSHOT或READ_COMMITTED_Locked
user960567 2013年

1
@ user960567,IIRC,Scott Ivey的回答将给出这些结果。
GaTechThomas 2013年

3
@zzzeek-这就是使用已经过时十二年的数据库所获得的。
马丁·布朗

46

只需运行DBCC useroptions,您将获得以下内容:

Set Option                  Value
--------------------------- --------------
textsize                    2147483647
language                    us_english
dateformat                  mdy
datefirst                   7
lock_timeout                -1
quoted_identifier           SET
arithabort                  SET
ansi_null_dflt_on           SET
ansi_warnings               SET
ansi_padding                SET
ansi_nulls                  SET
concat_null_yields_null     SET
isolation level             read committed

1
并且至少在SQL Server 2008上指出了活动时的“读取已提交快照”(请参阅​​RC快照与锁定状态)
user1075613

25
SELECT 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 AS TRANSACTION_ISOLATION_LEVEL 
FROM   sys.dm_exec_sessions AS s
       CROSS JOIN sys.databases AS d
WHERE  session_id = @@SPID
  AND  d.database_id = DB_ID();

6
也请详细说明代码,以提高教学效率。
lpapp 2014年

24
DECLARE   @UserOptions TABLE(SetOption varchar(100), Value varchar(100))
DECLARE   @IsolationLevel varchar(100)

INSERT    @UserOptions
EXEC('DBCC USEROPTIONS WITH NO_INFOMSGS')

SELECT    @IsolationLevel = Value
FROM      @UserOptions
WHERE     SetOption = 'isolation level'

-- Do whatever you want with the variable here...  
PRINT     @IsolationLevel

+1,因为它在与已读读一起使用时也会打印“快照”(而不是默认的共享锁定机制)
Shmil The Cat

这是矫枉过正,只是做DBCC USEROPTIONS作为thiagoh说
user1075613

9

如果您正在谈论当前的事务嵌套级别,则可以使用@@TRANCOUNT

如果您在谈论事务隔离级别,请使用DBCC USEROPTIONS并寻找隔离级别的选项。如果未设置,则将其读取为commit


5
还请记住,DBCC USEROPTIONS是查找SESSION隔离级别的绝佳选择,但可能会很棘手-如果您的代码更改每个事务的隔离级别,那么隔离级别与会话默认值不同的那些时间段可能会很困难捕获。例如,如果您打开隔离级别为x的会话,但在会话内特定事务的持续时间内将隔离级别更改为y,则DBCC USEROPTIONS将无法在该事务外部调用该会话,从而无法看到该级别。
DCaugs 2013年

1
在SQL Server 2012中,“隔离级别”的DBCC USEROPTIONS设置为“已读提交”
Gennady VaninГеннадийВанин2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.