我有多个进程,应该从表中获取一条记录,处理它并在处理时将其删除。表中的所有记录都需要以这种方式处理。
确保所有进程采用不同的记录并且不会跳过任何记录(没有创建单点故障)的最佳方法是什么?
答案 0 :(得分:1)
使用生产者 - 消费者模式。
使用来自db的SELECT
行的单线程进行处理,并将其分发给将进行实际处理的N个工作线程。假设只有工作人员可以访问已处理的行,他们也可以执行DELETE
。
答案 1 :(得分:1)
我过去做过这种方式的方法是添加" status"和" working_id"您要处理的表格的列。记录将来自状态"未处理"到"处理"完成"完成"。
然后每个线程沿着以下行开始工作:
update table
set status = processing,
worker_id = <<my thread ID>>
where status is null
and <<some way to select the rows you want to process>>
线程处理行;然后一旦完成:
delete from table
where status = processing
and worker_id = <<my thread ID>>
and <<some way to select the rows you just processed>>
通过将状态存储在数据库中,您可以创建一个健全性检查 - 例如,当应用程序开始和结束时,您应该没有处于状态&#34;处理&#34;的行。如果应用程序崩溃,您可以找到受影响的行。然后,您可以决定要做什么 - 您可能需要整理输出 - 但是通过将其标记为&#34;未处理&#34;,您可以重新运行该过程。
如果在事务中包装语句(您可能执行比此示例更复杂的逻辑),则可以保证原子性。