在表作為隊列的場景中,以某種方式配置和查詢它是至關重要的允許多個客戶端同時處理佇列項。
當使用帶有 UPDLOCK 和 ROWLOCK 的悲觀行鎖定時,只有一個工作線程可以獲得鎖並處理一行。要解決此問題並啟用並發處理,請考慮以下方法:
使用OUTPUT 子句實現佇列
OUTPUT 子句提供了一種原子地檢索和修改行的機制。以下是如何使用 OUTPUT 子句實現隊列:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
此查詢以原子方式執行以下步驟:
聚集索引最佳化
為了進一步最佳化效能,在 PROCESSED 欄位上建立聚集索引至關重要。這可確保資料按處理順序儲存。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
避免非標準查詢
為了獲得最佳吞吐量,必須避免使用以下方式查詢隊列表除上述出隊操作之外的方法。嘗試查看或將表用於其他目的可能會導致死鎖和效能下降。
以上是SQL Server如何作為多個客戶端的並發佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!