解決訂單處理中的 SQL Server 競爭條件
本文解決了一個常見問題:多個訂單處理器在透過預存程序存取訂單佇列時遇到競爭條件。 此預存程序使用唯一的 ID 來鎖定接下來的 20 個訂單以進行處理。 然而,並發存取可能會導致多個處理器聲明相同的順序,從而導致處理錯誤。
根本原因是未提交事務的可見性。 即使使用通常會阻止同時行存取的 ROWLOCK
,未提交的變更對於檢查鎖的其他處理器來說也是不可見的。這會產生競爭條件。
解涉及在 READPAST
和 UPDLOCK
語句中使用 SELECT
和 UPDATE
提示。 READPAST
告訴資料庫繞過鎖定的行,避免來自未提交更新的干擾。 UPDLOCK
確保更新行上的獨佔鎖,直到交易提交,防止其他處理器修改它們。
這是包含這些提示的改進程式碼:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
為了提高效率,請考慮使用 OUTPUT
子句。這合併了 SELECT
和 UPDATE
操作,一步更新表並傳回修改的行。這消除了對單獨 SELECT
語句的需要。
以上是如何解決訂單處理佇列中的 SQL Server 競爭條件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!