【发布时间】: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