【问题标题】:Deadlock on indexed view索引视图死锁
【发布时间】: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


【解决方案1】:

可用于解决死锁的典型方法包括:

  • 添加和删除索引。
  • 添加索引提示。
  • 修改应用程序以以类似的模式访问资源。
  • 从事务中删除活动,如触发器。
  • 尽可能缩短交易时间。

    在 SQL Server 中,您还可以最大限度地减少锁定争用,同时保护事务免受未提交数据修改的脏读,使用以下任一方法:

    • READ COMMITTED 隔离级别将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON。
    • SNAPSHOT 隔离级别。

加载侧重于锁定的 SQL Profiler,启动专门针对该数据库死锁的脚本,并将其提供给数据库引擎优化顾问,然后查看建议。

脚注http://support.microsoft.com/kb/832524

[[1]:http://support.microsoft.com/kb/832524

http://www.codeproject.com/Articles/42547/SQL-SERVER-How-To-Handle-Deadlock

之前的 Stackoverflow 锁定问题how to solve deadlock problem?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 2019-02-23
    • 1970-01-01
    • 2011-11-01
    • 2015-06-01
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多