¿Cómo encontrar el nivel de transacción actual?

Respuestas:

253

Ejecuta esto:

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

Referencia de docs.microsoft.com para los valores constantes .

SQLMenace
fuente
8
Este no es preciso si el nivel de aislamiento es "read_commited_snapshot". En este caso, solo mostrará "Readcommited".
GaTechThomas
8
@GaTechThomas, READ_COMMITTED_SNAPSHOTno es un nivel de aislamiento, es una opción de base de datos que permite cambiar el comportamiento del ReadDCommittednivel de aislamiento en toda la base de datos
Gennady Vanin Геннадий Ванин
@GaTechThomas, entonces cómo encontrar eso READ_COMMITTED_SNAPSHOT o READ_COMMITTED_Locked
usuario960567
1
@ user960567, IIRC, la respuesta de Scott Ivey daría esos resultados.
GaTechThomas
3
@zzzeek: eso es lo que obtienes por usar una base de datos que ha estado obsoleta durante doce años.
Martin Brown
46

solo corre DBCC useroptionsy obtendrás algo como esto:

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
fuente
1
y señala "leer instantánea confirmada" cuando está activa (ver instantánea RC vs bloqueada), al menos en SQL Server 2008
usuario1075613
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
fuente
66
También explique el código para ser más educativo.
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
fuente
+1 ya que también imprime 'instantánea' cuando se usa junto con lectura confirmada (y no el mecanismo de bloqueo compartido predeterminado)
Shmil The Cat
esto es excesivo, solo haga DBCC USEROPTIONS como dice
thiagoh
9

Si está hablando del nivel de anidación de la transacción actual , entonces usaría@@TRANCOUNT .

Si está hablando del nivel de aislamiento de transacciones , use DBCC USEROPTIONSy busque una opción de nivel de aislamiento . Si no está configurado, se lee como comprometido .

Eric Petroelje
fuente
55
También tenga en cuenta que DBCC USEROPTIONS es una excelente opción para encontrar el nivel de aislamiento de su SESIÓN, pero puede ser complicado: si su código cambia el nivel de aislamiento por transacción, esos períodos de tiempo donde el nivel de aislamiento es diferente del predeterminado de la sesión pueden ser difíciles capturar. Por ejemplo, si abre su sesión con el nivel de aislamiento x, pero cambia el nivel de aislamiento a y por la duración de una transacción específica dentro de la sesión, las USUARIOS DBCC no le darán visibilidad si se llama fuera de esa transacción.
DCaugs
1
En SQL Server 2012, el "nivel de aislamiento" de DBCC USEROPTIONSse establece en "lectura comprometida"
Gennady Vanin Геннадий Ванин