2008-10-21 8 views
6

다음 SQL을 고려하십시오.SQL Server에서 중첩 트랜잭션의 격리 범위는 무엇입니까?

 
BEGIN TRAN 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

INSERT Bands 
    ( Name ) 
SELECT 'Depeche Mode' 
UNION 
SELECT 'Arcade Fire' 

    -- I've indented the inner transaction to make it clearer. 

    BEGIN TRAN 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    SELECT * 
     FROM Bands 

    COMMIT 

-- What is the isolation level right here? 

UPDATE Bands 
    SET Name = 'Modest Mouse' 
WHERE Name = 'Oddest House' 

COMMIT 

요약하면 트랜잭션을 시작하고 격리 수준을 READ COMMITTED으로 설정합니다. 그런 다음 임의의 SQL을 수행하고 중첩 된 다른 트랜잭션을 시작합니다. 이 트랜잭션에서는 격리 수준을 READ UNCOMMITTED로 변경합니다. 그런 다음 거래를 커밋하고 다른 거래처로 돌아갑니다.

내 생각 엔 내부 커밋 후에 격리 수준이 READ COMMITTED로 돌아갑니다. 이 올바른지?

답변

7

나는 그것이 맞는 것 같지 않습니다.

여기 발언을 참조하십시오 Set Transaction 옵션을 한 번에 설정할 수있는 격리 수준의

하나, 그리고 은 명시 적으로 변경 때까지 해당 연결 설정 상태를 유지합니다.

+0

이것이 맞습니다. 방금 sp_lock으로 테스트했습니다. –

7

[Bob Probst]가 맞습니다. 흥미롭게도, documentation에 따라 당신은 연결 :

객체 반환 객체가 호출 될 때 격리 수준이 적용 수준으로 재설정 제어 할 때 저장 프로 시저 또는 트리거에서 트랜잭션 분리 레벨을 설정 발행하는 경우

. 예를 들어 일괄 처리에서 REPEATABLE READ를 설정하고 배치가 격리 수준을 SERIALIZABLE로 설정하는 저장 프로 시저를 호출하면 저장 프로 시저가 제어를 일괄 처리로 반환 할 때 격리 수준 설정이 REPEATABLE READ로 돌아갑니다.

그래서, 여기에 결론은 SET 트랜잭션 격리 수준은 (내가 생각했던대로) 절차 선호도하지 거래 선호도했다입니다.

굉장!

+2

글쎄, 롤! 내 C# 데이터베이스 API는 매번 새로운 연결을 열지 않고도 여러 함수를 호출 할 수 있도록 열린 연결 개체를 허용하는 경향이 있습니다. 이 "트랜잭션 친 화성"부족은 하나의 데이터베이스 API 메소드를 다른 것으로 호출하고 둘 다 트랜잭션을 사용하면 중첩 된 트랜잭션이 호출자의 트랜잭션의 트랜잭션 분리 레벨을 변경할 수 있음을 의미합니다. 확실히 짜증. 해결 방법 ... 트랜잭션을 사용하는 모든 C# 메서드에서 격리 수준 (dbcc useroptions)을 저장하고 반환하기 전에 복원하여 C# 코드로 C# 트랜잭션에 대한 절차 친 화성을 시뮬레이트합니다. – Triynko

+0

이 "anwer"는 코멘트 일 것입니다. 그러나 나에게 쉬게해라. 2008 년이었습니다. :) –

관련 문제