2

我一直在为这个僵局拉头发:

僵局

[放大]

IX_OrderAmounts 是在 Amount 表上进行聚合的索引视图。左侧的事务(可重复读取 - 尽管已提交读取也会发生同样的情况)仅在 Amount 表中插入一行。右侧的事务(已提交读)更新了 Amount 表中的几行(2 - 3 行)(全部在一个 UPDATE 语句中)。

现在我不明白为什么左边的事务,只需要插入一行,需要获取第二个更新锁。

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

我该如何解决这个死锁?

4

1 回答 1

2

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

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

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

    • READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON的 READ COMMITTED 隔离级别。
    • 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加锁问题如何解决死锁问题?

于 2013-02-09T15:52:10.110 回答