Comment trouver le niveau de transaction actuel?

Réponses:

253

Lance ça:

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 référence pour les valeurs constantes .

SQLMenace
la source
8
Celui-ci n'est pas précis si le niveau d'isolement est "read_commited_snapshot". Dans ce cas, il affichera uniquement "Readcommited".
GaTechThomas
8
@GaTechThomas, ce READ_COMMITTED_SNAPSHOTn'est pas un niveau d'isolement, c'est une option de base de données permettant de changer le comportement du ReadDCommittedniveau d'isolement à l'échelle de la base de données
Gennady Vanin Геннадий Ванин
@GaTechThomas, alors comment trouver que READ_COMMITTED_SNAPSHOT ou READ_COMMITTED_Locked
user960567
1
@ user960567, IIRC, la réponse de Scott Ivey donnerait ces résultats.
GaTechThomas
3
@zzzeek - C'est ce que vous obtenez en utilisant une base de données obsolète depuis douze ans.
Martin Brown
46

lancez simplement DBCC useroptionset vous obtiendrez quelque chose comme ça:

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
la source
1
et il indique «lire l'instantané validé» lorsqu'il est actif (voir instantané RC vs verrouillé), au moins sur 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
la source
6
Veuillez également préciser le code pour être plus éducatif.
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
la source
+1 car il imprime également 'instantané' lorsqu'il est utilisé avec la lecture
validée
c'est exagéré, il suffit de faire DBCC USEROPTIONS comme le dit
thiagoh
9

Si vous parlez du niveau d' imbrication de transaction actuel , vous utiliserez @@TRANCOUNT.

Si vous parlez de niveau d' isolation de transaction , utilisez DBCC USEROPTIONSet recherchez une option de niveau d'isolation . S'il n'est pas défini, la lecture est validée .

Eric Petroelje
la source
5
Gardez également à l'esprit que DBCC USEROPTIONS est une excellente option pour trouver le niveau d'isolement de votre SESSION, mais cela peut être délicat - si votre code change le niveau d'isolement par transaction, les périodes de temps où le niveau d'isolement est différent de la session par défaut peuvent être difficiles capturer. Par exemple, si vous ouvrez votre session avec le niveau d'isolement x, mais que vous modifiez le niveau d'isolement sur y pour la durée d'une transaction spécifique au sein de la session, DBCC USEROPTIONS ne vous donnera pas de visibilité sur cela s'il est appelé en dehors de cette transaction.
DCaugs
1
Dans SQL Server 2012, le "niveau d'isolement" de DBCC USEROPTIONSest défini sur "lecture
validée