2013-07-04 29 views
1

我正在为MCTS 70-433做准备,在阅读垃圾堆时我发现了这个问题。Set Transaction Isolation level serializable blocks blocks others transactions?

“你的任务是分析以下查询的阻止行为

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阻止e用户。该查询不会被其他查询阻止。 C.其他查询不会被用户阻止。该查询将被其他查询阻止。

D.其他查询不会被用户阻止。此查询将不会被其他查询被阻止。”

正确的答案给出D.

但是当使用串行事务级别,它会发出一个锁,防止其他事务仪式。??

请纠正我,如果我错了。

回答

2

这是一个有趣的问题,查询只运行在SalesOrder表。即使客户在CTE定义中使用的CTE从未访问使SQL Server将永远不会采取锁。

编辑:如果使用CTE,没有足够的信息来回答这个问题。给定的答案似乎假设表锁 - 但SQL Server将在大多数情况下使用行和范围锁。因此,分析阻止行为的唯一方法是查看这两个涉及的查询。

通常,对于SERIALIZABLE,将会阻止任何将修改结果集的查询。这包括引入不可重复的读取(例如,对SELECTed行的UPDATE),引入幻像读取(例如,将满足WHERE子句的INSERT),。后一部分是SERIALIZABLE赋予REPEATABLE READ的额外保证。

+0

哦,惊讶的是SQL服务器允许不使用的CTE。 – zerkms

+0

@MarkBrackett如果使用CTE并且其他一些事务使用Customer表会怎么样?那么结果会是什么? – Shrikey

+0

@Shrikey - 它很大程度上取决于涉及的查询。如果使用CTE,正确的答案是“信息不足”。除此之外,我不得不猜测“B”,因为只有一方可以被实际阻塞(否则,这是一个死锁)。尽管如此,这是一个很大的简化,因为涉及到多个锁。 –