Wie finde ich die aktuelle Transaktionsebene?

Antworten:

252

Führen Sie Folgendes aus:

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 Referenz für die konstanten Werte .

SQLMenace
quelle
8
Dieser ist nicht genau, wenn die Isolationsstufe "read_commited_snapshot" ist. In diesem Fall wird nur "Readcommited" angezeigt.
GaTechThomas
8
@GaTechThomas, READ_COMMITTED_SNAPSHOTist keine Isolationsstufe, es ist eine Datenbankoption, die es ermöglicht, das Verhalten der ReadDCommittedIsolationsstufe datenbankweit zu ändern
Gennady Vanin Геннадий Ванин
@ GaTechThomas, dann wie man das READ_COMMITTED_SNAPSHOT oder READ_COMMITTED_Locked findet
user960567
1
@ user960567, IIRC, Scott Iveys Antwort würde diese Ergebnisse liefern.
GaTechThomas
3
@zzzeek - Das bekommen Sie, wenn Sie eine Datenbank verwenden, die seit zwölf Jahren veraltet ist.
Martin Brown
46

Lauf einfach DBCC useroptionsund du bekommst so etwas:

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
quelle
1
und es weist darauf hin, dass "festgeschriebenen Snapshot lesen" aktiv ist (siehe RC-Snapshot vs gesperrt), zumindest unter 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
quelle
6
Bitte erläutern Sie auch den Code, um mehr Bildung zu erhalten.
lpapp
23
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
quelle
+1, da es auch "Schnappschuss" druckt, wenn es zusammen mit w / read festgeschrieben verwendet wird (und nicht der standardmäßige gemeinsame Sperrmechanismus)
Shmil The Cat
Dies ist übertrieben, machen Sie einfach DBCC USEROPTIONS, wie Thiagoh sagt
user1075613
9

Wenn Sie über die aktuelle Verschachtelungsebene für Transaktionen sprechen , würden Sie diese verwenden @@TRANCOUNT.

Wenn Sie sprechen über Transaktionsisolationsstufe, Verwendung DBCC USEROPTIONSund sucht nach einer Möglichkeit , Isolationsstufe . Wenn es nicht festgelegt ist, wird es festgeschrieben gelesen .

Eric Petroelje
quelle
5
Beachten Sie auch, dass DBCC USEROPTIONS eine hervorragende Option ist, um die Isolationsstufe Ihrer SESSION zu ermitteln. Dies kann jedoch schwierig sein. Wenn Ihr Code die Isolationsstufe pro Transaktion ändert, können die Zeiträume, in denen sich die Isolationsstufe von der Sitzungsstandard unterscheidet, schwierig sein erfassen. Wenn Sie beispielsweise Ihre Sitzung mit der Isolationsstufe x öffnen, die Isolationsstufe jedoch für die Dauer einer bestimmten Transaktion innerhalb der Sitzung auf y ändern, erhalten Sie mit den DBCC-USEROPTIONEN keinen Einblick in diese, wenn Sie außerhalb dieser Transaktion aufgerufen werden.
DCaugs
1
In SQL Server 2012 ist die "Isolationsstufe" von DBCC USEROPTIONSauf "
Festgeschrieben