【发布时间】:2013-01-25 04:33:25
【问题描述】:
我一直在为这个僵局拉头发:
[Enlarge]
IX_OrderAmounts 是在 Amount 表上进行聚合的索引视图。左侧的事务(可重复读取 - 尽管已提交读取也会发生同样的情况)仅在 Amount 表中插入一行。右侧的事务(已提交读取)更新了 Amount 表中的几行(2 - 3 行)(全部在一个 UPDATE 语句中)。
现在我不明白为什么左边的事务,只需要插入一行,需要获取第二个更新锁。
因为死锁在我不直接更新的索引视图上,所以我不能真正使用 SQL 提示(或者至少我不知道如何)。
如何解决这个死锁?
【问题讨论】:
-
请贴出左边语句的执行计划。最好是 XML (.sqlplan)。
-
右手查询似乎要求排他锁。你可以试试
with (rowlock)提示。 -
执行计划在这里:sdrv.ms/150WPut
-
在左侧,statement 还是 transaction 插入一行?在显示的计划中,应该只使用一个 U 型锁(并升级到 X)。那么之前有没有可能获得锁的语句?该索引视图上是否有任何以前的 DML?
-
不,事务中之前的语句只读取索引视图,所以它们最多应该有一个共享锁。
标签: sql-server deadlock isolation-level indexed-view