จะหาระดับธุรกรรมปัจจุบันได้อย่างไร


คำตอบ:


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" ในกรณีนี้มันจะแสดงเฉพาะ "อ่านแล้ว"
GaTechThomas

8
@GaTechThomas READ_COMMITTED_SNAPSHOTไม่ใช่ระดับการแยกเป็นตัวเลือกของฐานข้อมูลที่อนุญาตให้เปลี่ยนพฤติกรรมของReadDCommittedฐานข้อมูลระดับการแยก
Gennady Vanin ГеннадийВанин

@GaTechThomas แล้วจะหา READ_COMMITTED_SNAPSHOT นั้นหรือ READ_COMMITTED_Locked ได้อย่างไร
user960567

1
@ user960567, IIRC คำตอบของ Scott Ivey จะให้ผลลัพธ์เหล่านั้น
GaTechThomas

3
@zzzeek - นั่นคือสิ่งที่คุณได้รับจากการใช้ฐานข้อมูลที่ล้าสมัยมาสิบสองปีแล้ว
Martin Brown

47

เพียงแค่เรียกใช้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
และมันชี้ให้เห็น "read snapshot ที่ได้รับมอบหมาย" เมื่อใช้งาน (ดู RC snapshot vs ถูกล็อก) อย่างน้อยใน 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();

6
โปรดอธิบายอย่างละเอียดเกี่ยวกับรหัสเพื่อให้ความรู้เพิ่มเติม
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

+1 ตั้งแต่ยังพิมพ์ 'สแน็ปช็อต' เมื่อใช้พร้อมกับการอ่านที่กำหนด (และไม่ใช่กลไกการล็อคที่แชร์เป็นค่าเริ่มต้น)
Shmil The Cat

นี่คือ overkill เพียงทำ DBCC USEROPTIONS ตามที่ thiagoh พูด
1075613

9

หากคุณกำลังพูดคุยเกี่ยวกับการทำธุรกรรมในปัจจุบันการทำรัง@@TRANCOUNTระดับแล้วคุณจะใช้

หากคุณกำลังพูดคุยเกี่ยวกับการทำธุรกรรมการแยกระดับการใช้งานDBCC USEROPTIONSและมองหาตัวเลือกของระดับการแยก ถ้ามันไม่ได้ตั้งค่าก็อ่านความมุ่งมั่น


5
โปรดทราบว่าผู้ใช้ DBCC เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการค้นหาระดับการแยกของเซสชั่นของคุณ แต่มันอาจเป็นเรื่องยาก - หากรหัสของคุณเปลี่ยนระดับการแยกต่อการทำธุรกรรมช่วงเวลาที่ระดับการแยกนั้นแตกต่างจากค่าเริ่มต้นเซสชัน เพื่อจับภาพ ตัวอย่างเช่นถ้าคุณเปิดเซสชั่นของคุณด้วยการแยกระดับ x แต่เปลี่ยนระดับการแยกเป็น y สำหรับช่วงเวลาของการทำธุรกรรมที่เฉพาะเจาะจงในเซสชั่น DBCC USEROPTIONS จะไม่ให้คุณมองเห็นว่าถ้าเรียกนอกธุรกรรมนั้น
DCaugs

1
ใน SQL Server "ระดับการแยก" 2012 DBCC USEROPTIONSตั้ง "อ่านความมุ่งมั่น"
Gennady Vanin ГеннадийВанин
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.