현재 거래 수준을 찾는 방법은 무엇입니까?


답변:


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

8
@GaTechThomas는 READ_COMMITTED_SNAPSHOT, 그것의 동작 변경 허용하는 데이터베이스의 옵션 격리 수준입니다하지 않는 ReadDCommitted데이터베이스 차원의 격리 수준을
나디 Vanin Геннадий Ванин

@GaTechThomas는 다음 방법을 찾을 것을 READ_COMMITTED_SNAPSHOT 또는 READ_COMMITTED_Locked
user960567

1
@ user960567, IIRC, Scott Ivey의 답변이 그 결과를 줄 것입니다.
GaTechThomas

3
@zzzeek-12 년 동안 사용되지 않은 데이터베이스를 사용하면 얻을 수있는 것입니다.
Martin Brown

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 스냅 샷 vs 잠김 참조)
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

thiagoh가 말한 것처럼 DBCC 사용자 옵션을 수행하십시오.
user1075613

9

현재 트랜잭션 중첩 수준 에 대해 이야기하고 있다면@@TRANCOUNT 합니다.

당신은 트랜잭션에 대해 이야기하는 경우 격리 수준, 사용 DBCC USEROPTIONS의 옵션과 모양 격리 수준 . 설정되어 있지 않은 경우는 commit commit 입니다.


5
DBCC USEROPTIONS는 SESSION의 격리 수준을 찾기위한 훌륭한 옵션이지만, 까다로울 수 있습니다. 코드가 트랜잭션 당 격리 수준을 변경하면 격리 수준이 세션 기본값과 다른 기간이 어려울 수 있습니다. 캡처합니다. 예를 들어 격리 수준 x로 세션을 열었지만 세션 내 특정 트랜잭션 기간 동안 격리 수준을 y로 변경하면 DBCC USEROPTIONS는 해당 트랜잭션 외부에서 호출 된 경우이를 확인할 수 없습니다.
DCaugs

1
의 SQL 서버 2012 "격리 수준 ' DBCC USEROPTIONS으로 설정"최선을 다하고 읽기 "
나디 Vanin Геннадий Ванин
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.