我正在为MCTS 70 - 433做准备,在阅读转储时,我发现了这个问题。
“您的任务是分析以下查询的阻止行为
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
您需要确定此查询是否会阻止正在使用Customer表的其他查询。您还需要确定此查询是否将被使用customer表的其他查询阻止。
一个。其他查询将被用户阻止。此查询将被其他查询阻止。
B中。其他查询将被用户阻止。其他查询不会阻止此查询。
℃。其他查询不会被用户阻止。此查询将被其他查询阻止。
d。其他查询不会被用户阻止。其他查询不会阻止此查询。“
正确的答案是D.
但是当使用可序列化的事务级别时,它会发出锁定并停止其他事务处理。??
如果我错了,请纠正我。
答案 0 :(得分:2)
这是一个棘手的问题。该查询仅在SalesOrder表上运行。即使在CTE定义中使用了Customers,也永远不会访问CTE,因此SQL Server永远不会锁定。
编辑:如果使用CTE,则没有足够的信息来回答这个问题。给定的答案似乎假设一个表锁 - 但SQL Server在大多数情况下将使用行和范围锁。因此,分析阻止行为的唯一方法是查看所涉及的两个查询。
通常,对于SERIALIZABLE,将阻止任何修改结果集的查询。这包括引入不可重复的读取(例如,对SELECTed行的UPDATE),和引入幻像读取(例如,满足WHERE子句的INSERT)。后一部分是SERIALIZABLE赋予REPEATABLE READ的附加保证。