如何找到当前的交易级别?

dan*_*die 147 sql sql-server sql-server-2005 isolation-level sql-server-2008

如何在SQL Server上找到当前数据库的事务级别?

SQL*_*ace 238

运行这个:

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
Run Code Online (Sandbox Code Playgroud)

docs.microsoft.com对常量值的引用.

  • 如果隔离级别为"read_commited_snapshot",则此方法不准确.在这种情况下,它只会显示"Readcommited". (6认同)
  • @GaTechThomas,`READ_COMMITTED_SNAPSHOT`不是隔离级别,它是一个数据库的选项,允许更改数据库范围内`ReadDCommitted`隔离级别的行为 (6认同)
  • @zzzeek-这就是使用已经过时十二年的数据库的结果。 (2认同)
  • @StupidOne“读取已提交快照”不是一个独特的隔离级别,因此显示“读取已提交”是正确的。它是一个数据库选项,可更改 READ COMMITTED 的行为。要检查 READ_COMMITTED_SNAPSHOT 是否已启用,请查看以下内容:/sf/answers/3638421/ (2认同)
  • 我理解 READ COMMITTED SNAPSHOT 的技术性不是它自己独特的隔离级别,但这会让人认出并确实让我认出。在示例开始之前,MS 自己也在此页面下方显示的表格中将其声明为隔离级别,因此可以通过更加务实和符合 MS 的评论来改进此答案 https://docs.microsoft.com/en- us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15 (2认同)

thi*_*goh 40

只是运行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
Run Code Online (Sandbox Code Playgroud)


Sco*_*vey 21

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
Run Code Online (Sandbox Code Playgroud)


小智 21

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();
Run Code Online (Sandbox Code Playgroud)

  • 还请详细说明更具教育性的代码. (5认同)

Eri*_*lje 9

如果您正在谈论当前的事务嵌套级别,那么您将使用@@TRANCOUNT.

如果您正在讨论事务隔离级别,请使用DBCC USEROPTIONS并查找隔离级别选项.如果未设置,则读取已提交.

  • 另外请记住,DBCC USEROPTIONS是查找SESSION的隔离级别的一个很棒的选项,但它可能很棘手 - 如果您的代码更改了每个事务的隔离级别,那么隔离级别与会话默认值不同的那段时间可能很难捕捉.例如,如果您使用隔离级别x打开会话,但在会话中的特定事务持续时间内将隔离级别更改为y,则DBCC USEROPTIONS将不会让您在该事务之外调用该对象. (5认同)