从 SQL Server 队列进行并发处理
将表用作队列时,将其配置为由多个客户端并发处理可能会很困难。如果没有正确的配置,多个工作线程可能会尝试处理同一行,从而导致争用。
乐观并发控制:
提供的查询最初尝试获取悲观锁位于要处理的行上,只允许一名工作人员访问它。但是,这种方法可能会导致大量等待并降低并发性。
使用输出子句的悲观并发控制:
SQL Server 2005 引入了 OUTPUT 子句,它允许更多高效的悲观并发:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM EXAMPLE_TABLE WITH (READPAST) WHERE PROCESSED = 0 ) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
此查询使用以下命令查找第一个未处理的行READPAST 提示,忽略任何锁定的行。然后更新该行,将 PROCESSED 设置为 1。OUTPUT 子句返回更新后的行,该行由客户端处理。
表配置:
要优化此方法中,表的结构应使用 PROCESSED 列作为聚集索引的第一列。这确保了行按处理状态排序。
聚集索引和非聚集索引:
虽然可以考虑在 ID 列上使用非聚集索引,但它通常不建议用于频繁使用的队列。这是因为非聚集索引会带来额外的开销和复杂性。
查询限制:
为了获得最佳性能,查询队列表应仅限于 Dequeue 操作,避免 Peek 操作或将表用于排队和数据存储目的。
以上是如何高效处理 SQL Server 队列表的并发处理?的详细内容。更多信息请关注PHP中文网其他相关文章!