在表作为队列的场景中,以某种方式配置和查询它是至关重要的允许多个客户端同时处理队列项。
当使用带有 UPDLOCK 和 ROWLOCK 的悲观行锁定时,只有一个工作线程可以获得锁并处理一行。要解决此问题并启用并发处理,请考虑以下方法:
使用 OUTPUT 子句实现队列
OUTPUT 子句提供了一种原子地检索和修改行的机制。以下是如何使用 OUTPUT 子句实现队列:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
此查询以原子方式执行以下步骤:
聚集索引优化
为了进一步优化性能,在 PROCESSED 列上创建聚集索引至关重要。这可确保数据按处理顺序存储。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
避免非标准查询
为了获得最佳吞吐量,必须避免使用以下方式查询队列表除上述出队操作之外的方法。尝试查看或将表用于其他目的可能会导致死锁和性能下降。
以上是SQL Server如何作为多个客户端的并发队列?的详细内容。更多信息请关注PHP中文网其他相关文章!