避免 SQL Server 訂單佇列中的競爭條件
多個訂單處理器透過預存程序存取訂單佇列,每個訂單檢索 20 個訂單。 這可能會導致多個處理器獲取相同訂單的競爭條件,從而導致處理錯誤。
這是消除此並發問題的解決方案:
一種方法使用 READPAST
提示來繞過鎖定的行,並結合 ROWLOCK
來防止鎖定升級,以及 UPDLOCK
來實現獨佔行鎖定。 這允許每個處理器鎖定不同批次的行(例如,處理器 1 鎖定第 1-20 行,處理器 2 鎖定第 21-40 行,依此類推)。
修改後的預存程序將如下所示:
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
另一種方法涉及使用 OUTPUT
子句。這將 SELECT
和 UPDATE
操作組合成單一原子語句,確保更新的行立即可供處理器使用。 這消除了單獨的 SELECT
和 UPDATE
操作的需要,從而防止了競爭條件。
以上是處理來自 SQL Server 佇列的訂單時如何防止競爭條件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!