Как найти текущий уровень транзакции?

Ответы:

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 ссылка на постоянные значения .

SQLMenace
источник
8
Этот вариант не точен, если уровень изоляции равен «read_commited_snapshot». В этом случае будет отображаться только «Readcommited».
GaTechThomas
8
@GaTechThomas, READ_COMMITTED_SNAPSHOTэто не уровень изоляции, это опция базы данных, позволяющая изменить поведение ReadDCommittedуровня изоляции для всей базы данных
Геннадий Ванин Геннадий Ванин
@GaTechThomas, тогда как найти это READ_COMMITTED_SNAPSHOT или READ_COMMITTED_Locked
user960567
1
@ user960567, IIRC, ответ Скотта Айви даст эти результаты.
GaTechThomas
3
@zzzeek - это то, что вы получаете за использование базы данных, которая устарела в течение двенадцати лет.
Мартин Браун
47

просто беги 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
thiagoh
источник
1
и указывает на «чтение зафиксированного снимка», когда он активен (см. «Снимок RC против заблокированного»), по крайней мере, в SQL Server 2008
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();
SQLPro
источник
6
Пожалуйста, уточните код, чтобы быть более образовательным.
lpapp
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
9

Если вы говорите о текущем уровне вложенности транзакций , то вы должны использовать @@TRANCOUNT.

Если вы говорите об уровне изоляции транзакций , используйте DBCC USEROPTIONSи найдите вариант уровня изоляции . Если это не установлено, это прочитано передано .

Эрик Петроэль
источник
5
Также имейте в виду, что DBCC USEROPTIONS - отличный вариант для определения уровня изоляции вашего SESSION, но он может быть сложным - если ваш код меняет уровень изоляции для транзакции, периоды, когда уровень изоляции отличается от уровня по умолчанию сеанса, могут быть сложными. захватить. Например, если вы открываете сеанс с уровнем изоляции x, но изменяете уровень изоляции на y для продолжительности конкретной транзакции в рамках сеанса, DBCC USEROPTIONS не даст вам наглядного представления об этом, если он вызывается вне этой транзакции.
DCaugs
1
В SQL Server 2012 «уровень изоляции» DBCC USEROPTIONSустановлен как «чтение совершено»
Геннадий Ванин Геннадий Ванин