我们刚刚将生产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
事务隔离级别:读取提交
有人可以帮忙吗?
答案 0 :(得分:5)
这个select查询如何阻止插入事务?
是的,它可能导致锁的类型不兼容。 SELECT
查询需要SHARED
锁定,而INSERT
需要EXCLUSIVE
锁定且两者都不兼容。也就是说,共享锁如果存在于请求独占锁的同一资源(在您的AUDITHISTORYLOG_BACKUP_2017_1
表中);在取消共享锁或释放共享锁之前,不能授予独占锁。