Como encontrar o nível de transação atual?

Respostas:

253

Rode isto:

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 referência para os valores constantes .

SQLMenace
fonte
8
Este não é preciso se o nível de isolamento for "read_commited_snapshot". Nesse caso, ele mostrará apenas "Readcommited".
GaTechThomas
8
@GaTechThomas, READ_COMMITTED_SNAPSHOTnão é nível de isolamento, é a opção de um banco de dados que permite mudar o comportamento do ReadDCommittednível de isolamento de base de dados de largura
Gennady Vanin Геннадий Ванин
@GaTechThomas, como descobrir que READ_COMMITTED_SNAPSHOT ou READ_COMMITTED_Locked
user960567
1
@ user960567, IIRC, a resposta de Scott Ivey daria esses resultados.
GaTechThomas
3
@zzzeek - É o que você ganha por usar um banco de dados obsoleto há doze anos.
Martin Brown
46

basta correr DBCC useroptionse você terá algo parecido com isto:

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
fonte
1
e aponta "ler instantâneo comprometido" quando ativo (veja RC instantâneo vs bloqueado), pelo menos no 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
fonte
6
Por favor, também elabore o código para ser mais educativo.
Lpapp 23/02
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
fonte
+1 desde a sua também será impressa 'instantâneo' quando ele está sendo usado ao longo w / ler cometido (e não o mecanismo padrão compartilhada lock)
Shmil The Cat
isso é um exagero, basta fazer DBCC USEROPTIONS como thiagoh diz
#
9

Se você está falando sobre o nível de aninhamento de transação atual , você usaria @@TRANCOUNT.

Se você estiver falando sobre o nível de isolamento da transação , use DBCC USEROPTIONSe procure uma opção de nível de isolamento . Se não estiver definido, será lido confirmado .

Eric Petroelje
fonte
5
Lembre-se também de que DBCC USEROPTIONS é uma excelente opção para encontrar o nível de isolamento da sua SESSION'S, mas pode ser complicado - se o seu código alterar o nível de isolamento por transação, os períodos em que o nível de isolamento for diferente do padrão da sessão poderão ser difíceis. capturar. Por exemplo, se você abrir sua sessão com o nível de isolamento x, mas alterar o nível de isolamento para y pela duração de uma transação específica dentro da sessão, as USEROPTIONS do DBCC não lhe darão visibilidade se forem chamadas fora dessa transação.
DCaugs
1
No SQL Server 2012, o "nível de isolamento" de DBCC USEROPTIONSé definido como "leitura confirmada"
Gennady Vanin Геннадий Ванин