2013-02-09 60 views
1

我一直拉着这个僵局我的头发:僵局索引视图

Deadlock

[Enlarge]

IX_OrderAmounts是在金额表做一个聚集索引视图。左侧的事务(可重复读 - 尽管Read提交时发生同样的情况)只在Amount表中插入一行。右侧的事务(Read committed)从Amount表中更新了几行(2-3行)(全部在一个UPDATE语句中)。

现在我没有得到的是,为什么只需要插入一行的左侧事务需要获取第二个更新锁。

因为死锁是在索引视图上,我不直接更新,我不能真正使用SQL提示(或者至少我不知道如何)。

我该如何解决这个僵局?

+0

请张贴左侧语句的执行计划。最好用XML(.sqlplan)。 – usr 2013-02-09 14:24:30

+0

右侧的查询似乎是要求排他锁。你可以试试'with(rowlock)'提示。 – Andomar 2013-02-09 15:55:17

+0

执行计划如下:http:// sdrv。ms/150WPut – Flavien 2013-02-09 16:04:31

回答

2

你可以用它来解决死锁的典型方法包括:

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

    在SQL Server中,您还可以最大限度地减少锁定争,同时保护交易脏使用未提交的数据修改的读取或者:

    • 读取已提交的隔离级别与设置为ON READ_COMMITTED_SNAPSHOT数据库选项。
    • SNAPSHOT隔离级别。

,重点锁定负载SQL事件探查器,启动这僵局专门为DB和饲料到数据库引擎优化顾问,并审查建议的脚本。

脚注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

之前锁定#1问题how to solve deadlock problem?