SQL Server 2012:为什么where子句中的不同值会阻止选择查询?

时间:2017-01-26 14:34:26

标签: sql sql-server sql-server-2012 database-deadlocks

我们的应用程序会执行以下两个查询:

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 ......

4 个答案:

答案 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

花了大约一个小时才完成,但事情似乎有了很大改善。 所以,我添加了以下维护计划,每周执行一次:

enter image description here

如果有兴趣,这是我的观点的查询:

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