2013-07-04 3 views
1

나는 MCTS 70 - 433를 준비하고있는 동안 덤프를 읽는 동안이 질문을 발견했다.트랜잭션 격리 수준 serializable 블록은 다른 트랜잭션을 설정 하시겠습니까?

는 "당신은 다음과 같은 쿼리 차단 동작을 분석하는 임무된다

당신은 고객 테이블을 사용하는 다른 쿼리이 쿼리에 의해 차단 될 수 있는지를 확인해야합니다
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

WITH customers 
    AS (SELECT * 
     FROM customer), 
    salestotal 
    AS (SELECT customerid, 
       sum(ordertotal) AS Allordertotal 
     FROM salesorder) 
SELECT customerid, 
     allordertotal 
FROM salestotal 
WHERE allordertotal > 10000.00 

. 또한이 있는지 확인해야합니다 쿼리는 고객 테이블을 사용하는 다른 쿼리에 의해 차단됩니다. 다른 쿼리는 사용자가 차단됩니다

A.을.이 쿼리는 다른 쿼리에 의해 차단됩니다.

B. 다른 쿼리가됩니다 th에 의해 막히다. 전자 사용자. 이 쿼리는 다른 쿼리에 의해 차단되지 않습니다.

C. 다른 쿼리는 사용자가 차단하지 않습니다. 이 쿼리는 다른 쿼리에 의해 차단됩니다.

D. 다른 쿼리는 사용자에 의해 차단되지 않습니다. 이 쿼리는 ". 다른 쿼리에 의해 차단되지 않습니다

정답은 D.로 제공됩니다

그러나 직렬화 가능 트랜잭션 수준을 사용하는 경우, 그것은 잠금을 발행하고 다른 트랜잭션 의식을 중지합니다. ??

내가 잘못하면 나를 바로 잡으십시오

답변

2

쿼리는 SalesOrder 테이블에서만 실행됩니다 .CTE 정의에서 Customers를 사용하더라도 CTE는 액세스되지 않으므로 SQL Server는 절대로 자물쇠.

편집 : CTE가 사용 된 경우 질문에 대답 할만한 정보가 충분하지 않습니다. 주어진 응답은 테이블 잠금을 가정하는 것으로 보이지만 대부분의 경우 SQL Server는 행 및 범위 잠금을 사용합니다. 따라서 차단 동작을 분석 할 수있는 유일한 방법은 과 관련하여 개의 쿼리를 검토하는 것입니다.

일반적으로 SERIALIZABLE의 경우 결과 집합을 수정하는 쿼리가 차단됩니다. 여기에는 반복 불가능한 읽기 (예 : SELECT 행에 대한 UPDATE), 소개 팬텀 읽기 (예 : WHERE 절을 만족시키는 INSERT)가 포함됩니다. 후자의 부분은 SERIALIZABLE이 REPEATABLE READ보다 더 많이 제공된다는 추가 보증입니다.

+0

아, 놀랍지 만 SQL Server는 사용되지 않는 CTE를 허용합니다. – zerkms

+0

@MarkBrackett CTE가 사용되고 다른 트랜잭션이 고객 테이블을 사용하면 어떨까요? 그러면 결과는 무엇입니까? – Shrikey

+0

@Shrikey - 그것은 관련된 쿼리에 크게 달려 있습니다. CTE가 사용 된 경우 정답은 "충분하지 않은 정보"입니다. 그걸 막으려면, 한 쪽만 현실적으로 차단 될 수 있기 때문에 "B"를 추측해야합니다 (그렇지 않으면 교착 상태입니다). 그것은 비록 여러 개의 잠금이 포함되어 있기 때문에 총체적인 단순화입니다. –

관련 문제