2009-06-24 2 views

Odpowiedz

180

Run 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 
+3

Ten działa w SQL Azure :-) – Ronny

+5

Ten nie jest dokładny, jeśli poziom izolacji to" read_commited_snapshot ". W tym przypadku wyświetli się tylko "Readcommited". – GaTechThomas

+2

@GaTechThomas, 'READ_COMMITTED_SNAPSHOT' nie jest poziom izolacji, to opcja bazy danych za pozwalając aby zmienić zachowanie' poziom izolacji ReadDCommitted' baz całej –

8

Jeśli mówimy o aktualnej transakcji zagnieżdżania poziomu, to należy użyć @@TRANCOUNT.

Jeśli mówimy o transakcję izolacja poziomie, użyj DBCC USEROPTIONS i szukać opcją poziomie izolacji. Jeśli nie jest ustawiony, jest to przeczytane zatwierdzone.

+5

Należy także pamiętać, DBCC USEROPTIONS jest niesamowite rozwiązaniem dla znalezienia poziom izolacji SESJI, ale może to być trudne - jeśli twój kod zmienia poziom izolacji na transakcję, te okresy, w których izolacja poziom różni się od domyślnej sesji może być trudny do uchwycenia. Na przykład, jeśli otworzysz sesję z poziomem izolacji x, ale zmienisz poziom izolacji na y na czas określonej transakcji w ramach sesji, DBCC USEROPTIONS nie da ci widoczności, jeśli zostanie wywołana poza tą transakcją. – DCaugs

+1

W SQL Server 2012 "poziom izolacji" w 'DBCC USEROPTIONS' jest ustawiony na" read committed " –

20
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

Ten nie działa w SQL Azure – Ronny

+0

+1, ponieważ również drukuje "migawkę", gdy jest używany wraz z zatwierdzonym odczytem (a nie domyślnym mechanizmem blokady współdzielonej). –

+0

To jest przesada, po prostu wykonaj DBCC USEROPTIONS, jak mówi Thiagoh – user1075613

16
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(); 
+4

Proszę również rozwinąć kod, aby był bardziej edukacyjny. – lpapp

23

wystarczy uruchomić DBCC useroptions a 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 
+0

i wskazuje "odczyt zatwierdzonego migawki", gdy jest aktywny (patrz RC migawka vs zablokowane), przynajmniej na SQL Server 2008 – user1075613