我们的应用程序会执行以下两个查询:
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 ......
答案 0 :(得分:1)
一种可能性是其中一行3
上的未提交/展开后退交易。
如果使用事务,则需要使用TRY / CATCH并提交或回滚。
您可以尝试使用(NOLOCK)
:
select A.* from LETTUREAPERTE A (NOLOCK)
where IDAZIENDAOPERATORE=3
另一个选择是重新启动SQL服务器,以查看是否可以解决问题,但是可以重新安装
答案 1 :(得分:1)
正如Gordon在评论中建议的添加选项重新编译,如下所示
my_postoffice.template get_postbox<K>()
答案 2 :(得分:1)
尝试运行Adam Mechanic的sp_WhoIsActive
并跟踪可能使用相同表源的事务。之后在sp_lock
(系统一)中找到此对象。基于此,您应该知道为什么会出现这种僵局。
可能在执行期间,相同(锁定)索引不使用值2作为值3 - 这在表上使用过滤索引时是可能的。
答案 3 :(得分:1)
正如** Bartosz X **向我建议的那样,我为每个参与视图的表启动了以下命令:
UPDATE STATISTICS [Schema].[Table_Name] WITH FULLSCAN
花了大约一个小时才完成,但事情似乎有了很大改善。 所以,我添加了以下维护计划,每周执行一次:
如果有兴趣,这是我的观点的查询:
SELECT
IDOPERATORE,
COGNOMENOMEOPERATORE,
IDAZIENDAOPERATORE,
(SELECT
SUM(LETTURERIMASTE) AS Expr1
FROM dbo.LETTURERIMASTE AS B
WHERE (IDLOTTOLETTURISTA IN
(SELECT IDLOTTOLETTURISTA
FROM dbo.LOTTILETTURISTA AS C
WHERE (DATAFINELOTTOLETTURISTA >= CONVERT(datetime, ROUND(CONVERT(float, GETDATE()), 0, 1))) AND (IDLETTURISTALOTTOLETTURISTA = A.IDOPERATORE))))
AS LETTURERIMASTE