使用 SQL Server 作为并发多个客户端处理的数据库队列
跨多个客户端同时有效处理队列中的命令的能力是使用 SQL Server 作为数据库队列时必不可少。为了实现这一点,必须实现某些配置和查询优化。
一种方法涉及使用带有如下查询的悲观锁:
select top 1 COMMAND from EXAMPLE_TABLE with (UPDLOCK, ROWLOCK) where PROCESSED=false;
但是,此策略可能会导致多个之间的争用工作人员尝试获取相同的行锁。更有效的解决方案是利用 SQL Server 2005 中引入的 OUTPUT 子句。
OUTPUT 子句允许原子出队操作。它有助于在单个操作中查找适当的行、跳过锁定的行以及将所选行标记为出列:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
为了获得最佳性能,使用最左侧的聚集索引键构建表至关重要已处理列。如果 ID 作为主键存在,则应将其移动到聚集键中的第二列。此外,建议避免在队列上使用非聚集索引。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
此外,重要的是要避免使用表进行查看操作或同时用作队列和存储。这些做法可能会导致死锁并降低吞吐量。
通过遵守原子出队过程、利用 READPAST 提示并实现正确结构化的表,在使用 SQL Server 时可以在极其并发的负载下实现高吞吐量作为具有多个客户端的数据库队列。
以上是SQL Server 如何高效地处理跨多个客户端的并发队列处理?的详细内容。更多信息请关注PHP中文网其他相关文章!