Tại sao truy vấn này gây ra bế tắc?
UPDATE TOP(1) system_Queue SET
[StatusID] = 2,
@ID = InternalID
WHERE InternalID IN (
SELECT TOP 1
InternalID FROM system_Queue
WHERE IsOutGoing = @IsOutGoing AND StatusID = 1
ORDER BY MessageID ASC, InternalID ASC)
Biểu đồ bế tắc được thêm vào:
<keylock hobtid="72057594236436480" dbid="9" objectname="Z.dbo.system_Queue" indexname="PK_system_Queue" id="lock5b25cc80" mode="X" associatedObjectId="72057594236436480">
<owner-list>
<owner id="processc6fe40" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="processc7b8e8" mode="S" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594405453824" dbid="9" objectname="Z.dbo.system_Queue" indexname="IX_system_Queue_DirectionByStatus" id="lock48cf3180" mode="S" associatedObjectId="72057594405453824">
<owner-list>
<owner id="processc7b8e8" mode="S"/>
</owner-list>
<waiter-list>
<waiter id="processc6fe40" mode="X" requestType="wait"/>
</waiter-list>
</keylock>
THÊM:
Cảm ơn Sankar vì bài viết có giải pháp làm thế nào để tránh loại bế tắc này:
- loại bỏ các cột không cần thiết khỏi trình chiếu của người đọc để anh ta không phải tìm kiếm chỉ mục được nhóm
- thêm các cột được yêu cầu dưới dạng các cột được chứa vào chỉ mục không được phân cụm để làm cho chỉ mục được bao phủ, một lần nữa để người đọc không tìm kiếm chỉ mục được phân cụm
- tránh các bản cập nhật phải duy trì chỉ mục không phân cụm