簡體   English   中英

select 查詢的事務死鎖

[英]Transaction deadlock for select query

有時,對於僅是 Select 查詢的存儲過程,我會遇到以下錯誤: Transaction (Process ID 91) was deadlocked on lock

我最初的理解是,select 查詢不會鎖定表,或者即使它嘗試查詢的表正在被另一個進程更新/鎖定也不會導致死鎖,但似乎 select 查詢可能會導致死鎖出色地。

如果我將查詢的隔離級別設置為讀取未提交,那會解決問題嗎?

我的初始理解是 Select 查詢不會鎖定表,也不會導致死鎖

這種理解是錯誤的。 SELECT 查詢在他們分析的行上采用共享鎖。 共享鎖可能會與 update/delete/insert 語句中的獨占鎖發生沖突。 兩個 SELECT 語句不會死鎖,但 SELECT 可以通過 UPDATE 死鎖。 當這種死鎖發生時,SELECT 通常是受害者,因為它沒有執行任何更新,所以總是會失去平局。

與任何死鎖一樣,您需要發布所涉及表的確切架構、確切的 T-SQL 語句和死鎖圖。 請參閱如何:保存死鎖圖 (SQL Server Profiler) 有了這些信息,您可以獲得如何修復死鎖的指導。

就像 Remus 說的那樣,您遇到了死鎖,因為 SELECT 和 UPDATE(或其他)操作彼此死鎖,而不是 SELECT 與 SELECT。 您將不得不查看所有涉及該表的查詢並為這些查詢創建適當的覆蓋索引,這將解決您的問題。 良好的覆蓋索引是首選解決方案,而不是使用 WITH (NOLOCK) 表提示。

有關如何創建覆蓋索引以及它如何影響死鎖的優秀教程,請參閱以下鏈接

如果您使用的是 SQL Server 2008,您可以將隔離級別設置為未提交讀取以防止死鎖。 請參閱此鏈接 在讀取未提交或 WITH (NOLOCK) 時,必須注意查詢返回的數據可能不是真實的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM