避免 SQL Server 订单队列中的竞争条件
多个订单处理器通过存储过程访问订单队列,每个订单检索 20 个订单。 这可能会导致多个处理器获取相同订单的竞争条件,从而导致处理错误。
这是消除此并发问题的解决方案:
一种方法使用 READPAST
提示来绕过锁定的行,并结合 ROWLOCK
来防止锁定升级,以及 UPDLOCK
来实现独占行锁定。 这允许每个处理器锁定不同批次的行(例如,处理器 1 锁定第 1-20 行,处理器 2 锁定第 21-40 行,依此类推)。
修改后的存储过程将如下所示:
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
另一种方法涉及使用 OUTPUT
子句。这将 SELECT
和 UPDATE
操作组合成单个原子语句,保证更新的行立即可供处理器使用。 这消除了单独的 SELECT
和 UPDATE
操作的需要,从而防止了竞争条件。
以上是处理来自 SQL Server 队列的订单时如何防止竞争条件?的详细内容。更多信息请关注PHP中文网其他相关文章!