Bagaimana cara menemukan tingkat transaksi saat ini?

Jawaban:

253

Jalankan ini:

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

referensi docs.microsoft.com untuk nilai konstan .

SQLMenace
sumber
8
Yang ini tidak akurat jika tingkat isolasi adalah "read_commited_snapshot". Dalam hal ini, itu hanya akan menampilkan "Readcommited".
GaTechThomas
8
@ GaTechThomas, READ_COMMITTED_SNAPSHOTbukan tingkat isolasi, ini merupakan opsi basis data yang memungkinkan untuk mengubah perilaku ReadDCommittedtingkat-lebar basis data tingkat isolasi
Gennady Vanin Геннадий Ванин
@GaTechThomas, lalu bagaimana menemukan itu READ_COMMITTED_SNAPSHOT atau READ_COMMITTED_Locked
user960567
1
@ user960567, IIRC, jawaban Scott Ivey akan memberikan hasil tersebut.
GaTechThomas
3
@zzzeek - Itulah yang Anda dapatkan karena menggunakan basis data yang telah usang selama dua belas tahun.
Martin Brown
46

jalankan saja DBCC useroptionsdan Anda akan mendapatkan sesuatu seperti ini:

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
sumber
1
dan itu menunjukkan "baca snapshot yang dilakukan" ketika aktif (lihat RC snapshot vs terkunci), setidaknya pada 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
sumber
6
Tolong juga uraikan kode untuk menjadi lebih mendidik.
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
sumber
+1 karena ini juga mencetak 'snapshot' saat digunakan bersama dengan komitmen baca (dan bukan mekanisme kunci bersama bawaan)
Shmil The Cat
ini berlebihan, lakukan saja PENGGUNAAN DBCC seperti yang dikatakan
thiagoh
9

Jika Anda berbicara tentang transaksi saat bersarang tingkat, maka Anda akan menggunakan @@TRANCOUNT.

Jika Anda berbicara tentang tingkat isolasi transaksi , gunakan DBCC USEROPTIONSdan cari opsi tingkat isolasi . Jika tidak disetel, berarti sudah dibaca .

Eric Petroelje
sumber
5
Perlu diingat DBER USEROPTIONS adalah opsi yang luar biasa untuk menemukan tingkat isolasi SESSION Anda, tetapi itu bisa rumit - jika kode Anda mengubah tingkat isolasi per transaksi, periode waktu di mana tingkat isolasi berbeda dari sesi standar bisa sulit. untuk menangkap. Misalnya, jika Anda membuka sesi Anda dengan tingkat isolasi x, tetapi mengubah tingkat isolasi menjadi y selama durasi transaksi tertentu dalam sesi, PENGGUNAAN DBCC tidak akan memberi Anda visibilitas ke dalam itu jika dipanggil di luar transaksi itu.
DCaugs
1
Di SQL Server 2012 "level isolasi" dari DBCC USEROPTIONSdiatur ke "read berkomitmen"
Gennady Vanin Геннадий Ванин