2017-01-12 70 views
2

我們剛剛將我們的生產sql實例從2012年升級到2016年標準版。由於我們一直在努力尋找存在僵局的情況,因此我剛剛面對一個並且不太瞭解究竟發生了什麼。我不明白這個問題的原因是一個會話阻塞了另一個會話,但阻塞會話是一個選擇查詢會話。它會阻止另一個會話插入表。SELECT查詢是否鎖定SQL Server中的表或頁面?

被阻止的會話查詢是;

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
事務隔離級別:讀已提交

誰能幫助?

回答

5

此選擇查詢如何阻止插入事務?

是的,它可以導致鎖的類型不兼容。 A SELECT查詢需要SHARED鎖,而INSERT需要EXCLUSIVE鎖並且兩者不兼容。也就是說,如果共享鎖存在於請求排它鎖的相同資源上(在您的案例AUDITHISTORYLOG_BACKUP_2017_1表中);在共享鎖取消或共享鎖釋放之前,不能授予排它鎖。

+0

我不知道排他鎖需要共享鎖被釋放。而且,在升級之前,我從來沒有遇到過這種類型的問題。這就是爲什麼我要深入探討問題的原因。 –

+0

https://technet.microsoft.com/zh-cn/library/ms186396(v=sql.105).aspx –

+0

感謝您的答案。 –