Jak sprawdzić aktualny poziom transakcji?

Odpowiedzi:

253

Uruchom to:

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

Dokumentacja docs.microsoft.com dotycząca wartości stałych .

SQLMenace
źródło
8
Ten nie jest dokładny, jeśli poziom odseparowania to „read_commited_snapshot”. W takim przypadku pokaże tylko „Readcommited”.
GaTechThomas
8
@GaTechThomas, READ_COMMITTED_SNAPSHOTnie jest poziomem izolacji, to opcja bazy danych pozwalająca na zmianę zachowania ReadDCommittedpoziomu izolacji w całej bazie danych
Gennady Vanin Геннадий Ванин
@GaTechThomas, więc jak znaleźć to READ_COMMITTED_SNAPSHOT lub READ_COMMITTED_Locked
user960567
1
@ user960567, IIRC, odpowiedź Scotta Iveya dałaby takie wyniki.
GaTechThomas,
3
@zzzeek - To jest to, co otrzymujesz, używając bazy danych, która jest przestarzała od dwunastu lat.
Martin Brown
46

po prostu biegnij, DBCC useroptionsa otrzymasz coś takiego:

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
źródło
1
i wskazuje „odczyt zatwierdzonej migawki”, gdy jest aktywny (patrz migawka RC vs zablokowana), przynajmniej na 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
źródło
6
Proszę również rozwinąć kod, aby był bardziej pouczający.
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
Scott Ivey
źródło
+1, ponieważ wypisuje również
``
to przesada, po prostu zrób DBCC USEROPTIONS, jak mówi
thiagoh
9

Jeśli mówisz o obecnym poziomie zagnieżdżenia transakcji , użyj@@TRANCOUNT .

Jeśli mówisz o poziomie izolacji transakcji , użyj DBCC USEROPTIONSi poszukaj opcji poziomu izolacji . Jeśli nie jest ustawiona, oznacza to, że została przeczytana .

Eric Petroelje
źródło
5
Pamiętaj również, że DBCC USEROPTIONS to świetna opcja do znalezienia poziomu izolacji SESJI, ale może być trudna - jeśli Twój kod zmienia poziom izolacji na transakcję, okresy, w których poziom izolacji różni się od domyślnego poziomu sesji, mogą być trudne łapać, chwytać. Na przykład, jeśli otworzysz sesję z poziomem izolacji x, ale zmienisz poziom izolacji na y na czas trwania określonej transakcji w ramach sesji, DBCC USEROPTIONS nie zapewni Ci wglądu w to, jeśli zostanie wywołany poza tą transakcją.
DCaugs,
1
W programie SQL Server 2012 „poziom izolacji” DBCC USEROPTIONSjest ustawiony na „odczyt
zatwierdzony