您的訂單處理系統正在經歷競爭條件,因為多個處理器正在檢索相同的記錄。 解決此問題的方法如下:
理解問題:
問題源自於預存程序使用 ROWLOCK
提示並結合單獨鎖定的視圖中的選擇。這允許多個處理器鎖定同一筆記錄,從而導致資料損壞。
解決方案使用提示:
要解決競爭條件,請使用 READPAST
和 UPDLOCK
提示:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
避免在選擇過程中鎖定行,確保連續查詢執行。 UPDLOCK
確保更新期間正確鎖定,防止並發修改。
更有效的解決方案:
更簡化的方法使用 OUTPUT
子句來組合 SELECT
和 UPDATE
操作:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
這消除了對單獨的 SELECT
語句的需要,提高了效率和程式碼清晰度。
以上是如何解決因重複記錄檢索而導致的訂單處理中的 SQL Server 競態條件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!