現在のトランザクションレベルを見つける方法は?


回答:


253

これを実行してください:

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リファレンス


8
分離レベルが「read_commited_snapshot」の場合、これは正確ではありません。この場合、「Readcommited」のみが表示されます。
GaTechThomas 2013年

8
@GaTechThomas READ_COMMITTED_SNAPSHOTは分離レベルではなく、データベースReadDCommitted全体の分離レベルの動作を変更できるデータベースのオプションです
Gennady VaninGеннадийВанинDec

@GaTechThomas、そのREAD_COMMITTED_SNAPSHOTまたはREAD_COMMITTED_Lockedを見つける方法
user960567

1
@ user960567、IIRC、Scott Iveyの回答でこれらの結果が得られます。
GaTechThomas 2013

3
@zzzeek-これは、12年間使用されなくなったデータベースを使用することで得られるものです。
マーティンブラウン

46

実行するだけでDBCC useroptions、次のような結果が得られます。

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
そして、少なくともSQL Server 2008では、アクティブなときに「コミットされたスナップショットの読み取り」(RCスナップショットとロックの
比較を参照)を指摘し

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
より教育的なものになるようにコードについても詳しく説明してください。
lpapp 2014

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は、コミットされた読み取り(およびデフォルトの共有ロックメカニズムではない)と共に使用された場合にも「スナップショット」を出力するため
Shmil The Cat

これはやり過ぎです。thiagohが言うように、DBCC USEROPTIONSを実行してください
user1075613

9

現在のトランザクションのネストレベルについて話している場合は、を使用します@@TRANCOUNT

トランザクション分離レベルについて話DBCC USEROPTIONSしている場合は、分離レベルのオプションを使用してください。設定されていない場合は、コミットされ読み取りです。


5
また、DBCC USEROPTIONSはSESSIONの分離レベルを見つけるための素晴らしいオプションですが、コードがトランザクションごとに分離レベルを変更する場合、分離レベルがセッションのデフォルトと異なる期間は難しい場合があることに注意してください。キャプチャします。たとえば、分離レベルxでセッションを開いたが、セッション内の特定のトランザクションの間、分離レベルをyに変更した場合、DBCC USEROPTIONSは、そのトランザクション外で呼び出された場合、その可視性を提供しません。
DCaugs 2013年

1
SQL Server 2012では、「分離レベル」がDBCC USEROPTIONS「コミットされた読み取り」に設定されています
Gennady Vanin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.