给定一个充当队列的表,如何最好地配置表/查询,以便多个客户端可以同时从队列中处理?
例如,下面的表格表示工作人员必须处理的命令。 当工作人员完成后,它将将processed值设置为true。
| ID | COMMAND | PROCESSED |
| 1 | ... | true |
| 2 | ... | false |
| 3 | ... | false |
客户端可能会这样获取一个要操作的命令:
select top 1 COMMAND
from EXAMPLE_TABLE
with (UPDLOCK, ROWLOCK)
where PROCESSED=false;
然而,如果有多个工作进程,每个进程都试图获取ID为2的行。只有第一个会获得悲观锁,其余的将等待。然后其中一个进程将获取第三行,依此类推。
哪种查询/配置可以让每个工作进程分别获得不同的行并同时处理它们?
编辑:
有几个答案建议变体使用表本身记录正在进行的状态。我认为这在单个事务中是不可能的。(即,如果没有其他工作者在提交事务之前看到它,更新状态有什么意义呢?)也许建议是:
# start transaction
update to 'processing'
# end transaction
# start transaction
process the command
update to 'processed'
# end transaction
人们通常是这样处理这个问题的吗?我觉得如果可能的话,问题最好由数据库来处理。