首頁 > 資料庫 > mysql教程 > 如何解決訂單處理佇列中的 SQL Server 競爭條件?

如何解決訂單處理佇列中的 SQL Server 競爭條件?

Susan Sarandon
發布: 2025-01-18 01:26:12
原創
709 人瀏覽過

How to Resolve a SQL Server Race Condition in an Order Processing Queue?

解決訂單處理中的 SQL Server 競爭條件

本文解決了一個常見問題:多個訂單處理器在透過預存程序存取訂單佇列時遇到競爭條件。 此預存程序使用唯一的 ID 來鎖定接下來的 20 個訂單以進行處理。 然而,並發存取可能會導致多個處理器聲明相同的順序,從而導致處理錯誤。

根本原因是未提交事務的可見性。 即使使用通常會阻止同時行存取的 ROWLOCK,未提交的變更對於檢查鎖的其他處理器來說也是不可見的。這會產生競爭條件。

解涉及在 READPASTUPDLOCK 語句中使用 SELECTUPDATE 提示。 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 子句。這合併了 SELECTUPDATE 操作,一步更新表並傳回修改的行。這消除了對單獨 SELECT 語句的需要。

以上是如何解決訂單處理佇列中的 SQL Server 競爭條件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板