索引视图上的死锁

时间:2013-02-09 14:15:04

标签: sql-server deadlock isolation-level indexed-view

我一直在抓住这个僵局:

Deadlock

[Enlarge]

IX_OrderAmounts是一个在Amount表上进行聚合的索引视图。左侧的事务(可重复读取 - 尽管与Read commited相同)仅在Amount表中插入一行。右侧的事务(Read committed)从Amount表中更新几行(2 - 3行)(所有在一个UPDATE语句中)。

现在我不知道的是为什么左边的事务只需要插入一行就需要获得第二次更新锁。

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

如何解决此死锁?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

加载SQL事件探查器,重点关注锁定,启动专门针对该数据库的死锁脚本并将其提供给数据库引擎优化顾问,并查看建议。

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