您的订单处理系统正在经历竞争条件,因为多个处理器正在检索相同的记录。 解决此问题的方法如下:
理解问题:
问题源于存储过程使用 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中文网其他相关文章!