【发布时间】:2017-06-12 01:31:45
【问题描述】:
我们的应用程序执行这两个查询:
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=3
和
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=2
根据用户正在考虑的公司 ID。
好吧,虽然第二个查询正确执行,但第一个查询阻塞并且永远不会执行。 LETTUREAPERTE 表中的记录少于 400 条,有的有 IDAZIENDAOPERATORE 有 2 条,有的有 3 条。
我不知道为什么会发生这种情况以及为什么第一个查询会阻塞...最后我得到了这个错误我得到一个错误,说进程被选为死锁牺牲品。
事务(进程 ID 62)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。
我什至运行了一些查询来检测该表的某些记录上是否存在一些更新锁,但没有。这一定是因为在整个项目中我们从未在查询中使用过UPDLOCK...
【问题讨论】:
-
加
with option (recompile)看看有没有更好的执行计划。 -
嗯,我应该在哪里添加
with option (recompile)?这是什么声明? -
select A.* from LETTUREAPERTE A where IDAZIENDAOPERATORE=2 with option(recompile)..但我认为这不会影响有 400 条记录的表。你能发布死锁图吗 -
我得到相同的结果...有时需要 80 秒才能执行。正如我之前所说的那样,它有时会中止......
-
你可以把执行计划贴在这里分享给大家:brentozar.com/pastetheplan
标签: sql sql-server sql-server-2012 database-deadlocks