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