Come trovare il livello di transazione corrente?


Risposte:


253

Esegui questo:

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 riferimento per i valori costanti .


8
Questo non è preciso se il livello di isolamento è "read_commited_snapshot". In questo caso, mostrerà solo "Readcommited".
GaTech Thomas

8
@GaTechThomas, READ_COMMITTED_SNAPSHOTnon è un livello di isolamento, è un'opzione di database che consente di modificare il comportamento del ReadDCommittedlivello di isolamento a livello di database
Gennady Vanin Геннадий Ванин

@GaTechThomas, quindi come trovare READ_COMMITTED_SNAPSHOT o READ_COMMITTED_Locked
user960567

1
@ user960567, IIRC, la risposta di Scott Ivey darebbe quei risultati.
GaTechThomas

3
@zzzeek: ecco cosa ottieni usando un database obsoleto da dodici anni.
Martin Brown,

46

corri DBCC useroptionse otterrai qualcosa del genere:

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
e indica "leggi istantanea impegnata" quando è attiva (vedere Istantanea RC vs bloccata), almeno su 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();

6
Si prega inoltre di elaborare il codice per essere più istruttivo.
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 poiché stampa anche 'istantanea' quando viene utilizzato insieme a w / read commit (e non al meccanismo di blocco condiviso predefinito)
Shmil The Cat,

questo è eccessivo, basta fare USEROPTIONS DBCC come dice
thiagoh

9

Se stai parlando dell'attuale livello di annidamento delle transazioni , allora useresti @@TRANCOUNT.

Se stai parlando del livello di isolamento delle transazioni , usa DBCC USEROPTIONSe cerca un'opzione di livello di isolamento . Se non impostato, viene letto come commit .


5
Inoltre, tieni presente che DBCC USEROPTIONS è un'opzione fantastica per trovare il livello di isolamento della SESSIONE, ma può essere complicato: se il codice cambia il livello di isolamento per transazione, quei periodi in cui il livello di isolamento è diverso dal valore predefinito della sessione può essere difficile catturare. Ad esempio, se si apre la sessione con il livello di isolamento x, ma si modifica il livello di isolamento su y per la durata di una transazione specifica all'interno della sessione, le USEROPTIONS DBCC non ti daranno visibilità se chiamato al di fuori di quella transazione.
DCaugs

1
In SQL Server 2012 il "livello di isolamento" di DBCC USEROPTIONSè impostato su "read commit"
Gennady Vanin Геннадий Ванин
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.