设置事务隔离级别可序列化阻止其他事务?

时间:2013-07-04 03:02:16

标签: sql-server sql-server-2008 transactions

我正在为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.

但是当使用可序列化的事务级别时,它会发出锁定并停止其他事务处理。??

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:2)

这是一个棘手的问题。该查询仅在SalesOrder表上运行。即使在CTE定义中使用了Customers,也永远不会访问CTE,因此SQL Server永远不会锁定。

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

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