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

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

Susan Sarandon
Susan Sarandon原創
2025-01-18 01:26:12710瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn