【问题标题】:Does SELECT query lock a table or a page in SQL Server?SELECT 查询是否会锁定 SQL Server 中的表或页面?
【发布时间】:2017-01-12 07:04:16
【问题描述】:

我们刚刚将生产 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

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

Wait_Type:LCK_M_IX
Wait_Resource:页面:10:1:20598647
事务隔离级别:已提交读

谁能帮忙?

【问题讨论】:

    标签: sql sql-server locking


    【解决方案1】:

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

    是的,它会导致锁的类型不兼容。 SELECT 查询需要SHARED 锁,而INSERT 需要EXCLUSIVE 锁,两者不兼容。也就是说,如果在请求排他锁的同一资源(在您的情况下为 AUDITHISTORYLOG_BACKUP_2017_1 表)上存在共享锁;在取消共享锁或释放共享锁之前,无法授予该独占锁。

    【讨论】:

    • 不知道排他锁需要共享锁才能释放。而且,在此次升级之前,我从未遇到过此类问题。这就是为什么我要深入研究问题的原因。
    • 感谢您的回答。
    • @Rahul 是的,我做到了
    猜你喜欢
    • 2012-08-03
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多