Як знайти поточний рівень транзакцій?


Відповіді:


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ізоляції на базі даних
Геннадій Ванін Геннадій Ванін

@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

1
і це вказує на "читання зробленого знімка", коли він активний (див. знімок RC проти заблокованого), принаймні на SQL Server 2008
користувач1075613,

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

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

це зайве, просто зробіть ДЕРЖАВНІ ВИКОРИСТАННЯ, як каже
thiagoh

9

Якщо ви говорите про поточний рівень вкладення транзакцій , тоді ви б скористалися @@TRANCOUNT.

Якщо ви говорите про рівень ізоляції транзакцій , використовуйте DBCC USEROPTIONSта шукайте варіант рівня ізоляції . Якщо його не встановлено, воно зчитується здійсненим .


5
Також пам’ятайте, що користувачі DBCC USEROPTIONS є приголомшливим варіантом пошуку рівня ізоляції вашого SESSION, але це може бути складним - якщо ваш код змінює рівень ізоляції за транзакцією, ті періоди часу, коли рівень ізоляції відрізняється від стандартного за сеансом, можуть бути важкими. захопити. Наприклад, якщо ви відкриєте сеанс із рівнем ізоляції x, але зміните рівень ізоляції на y протягом тривалості певної транзакції в межах сеансу, DBCC USEROPTIONS не надасть вам видимість цього, якщо викликається поза цією транзакцією.
DCaugs

1
У SQL Server 2012 "рівень ізоляції" DBCC USEROPTIONSвстановлений на "читання здійснено"
Геннадій Ванін Геннадій Ванин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.