【问题标题】:VIEW repeatedly deadlocked by application-side commandsVIEW 反复被应用程序端命令死锁
【发布时间】:2017-01-25 05:05:44
【问题描述】:

我有一个模式绑定视图 (SSMS 2008 R2),它运行一组由前端应用程序维护和更新的表。本周早些时候,在更新应用程序的部署之后,尽管在 Dev thru Staging 中成功运行,但每次在 Prod 中运行时,视图都会突然死锁。

运行跟踪并抓取死锁图显示竞争的 DELETE 语句来自应用程序(它不更新记录;而是删除和插入)。

Edit1:死锁是由与 IX 级锁竞争的应用程序端命令引起的。 VIEW 发出 S 级锁,但竞争命令继续死锁,VIEW 查询始终是受害者进程。将隔离设置为“读取未提交”并不能解决问题。

VIEW 递归地多次对同一个表进行外部连接,以创建记录的链接历史记录。我怀疑这是使 VIEW 过于复杂而无法逃避锁定时间的功能。它似乎工作了半天,然后会一直僵持在其他人身上。

这仅仅是一个能力问题,还是有更好的方法来建立报告结构来解决僵局问题?

【问题讨论】:

  • 这里的手太多了,给我们看看代码。从视图定义开始,然后是其支持表及其索引/键的定义。
  • 这个问题最终与应用程序与数据库表的交互方式有关。不确定您指的这个“我们”是谁(Ed Green 给出了可靠的回答尝试,这确实是我尝试过的第一件事)。供将来参考 - 即使使用 READ UNCOMMITTED 也会出现死锁。该应用程序被配置为为任何和所有事务锁定(未分区的)表,这意味着它本身不是数据库问题,而是我们工作环境的一个特性。有时解决方案并不像向我们展示代码

标签: sql sql-server-2008 tsql view database-deadlocks


【解决方案1】:

如果您在视图中遇到很多死锁,则可能值得将其分解为大量更简单的视图 - 其中模式绑定视图具有从多个表中提取的索引,它也可能特别容易锁定问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多