SELECT查询是否锁定SQL Server中的表或页面?

时间:2017-01-12 07:04:16

标签: sql sql-server locking

我们刚刚将生产sql实例从2012升级到2016标准版。由于我们一直在努力寻找死锁以防它存在,我刚刚面对一个并且不太明白究竟发生了什么。我不理解该问题的原因是一个会话阻止了另一个会话,但阻塞会话是一个选择查询会话。它阻止另一个会话插入表。

被阻止的会话查询是;

INSERT INTO [AUDITHISTORYLOG_BACKUP_2017_1]([TABLE_NAME],[OPERATION_TYPE],[HOST_NAME],[USER_NAME],[PRIMARY_KEY],[FIELD],[OLD_VALUE],[NEW_VALUE],[CREATE_DATE]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9)

阻塞会话查询是;

SELECT * FROM AuditDB.dbo.AUDITHISTORYLOG_BACKUP_2017_1 WHERE CREATE_DATE>CAST(GETDATE()-30 AS DATE) ORDER BY CREATE_DATE DESC

这个select查询如何阻止插入事务?

Wait_Type:LCK_M_IX
Wait_Resource:PAGE:10:1:20598647
事务隔离级别:读取提交

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

  

这个select查询如何阻止插入事务?

是的,它可能导致锁的类型不兼容。 SELECT查询需要SHARED锁定,而INSERT需要EXCLUSIVE锁定且两者都不兼容。也就是说,共享锁如果存在于请求独占锁的同一资源(在您的AUDITHISTORYLOG_BACKUP_2017_1表中);在取消共享锁或释放共享锁之前,不能授予独占锁。