清空具有多个并发进程的数据库表

时间:2016-10-03 12:17:02

标签: java database

我有多个进程,应该从表中获取一条记录,处理它并在处理时将其删除。表中的所有记录都需要以这种方式处理。

确保所有进程采用不同的记录并且不会跳过任何记录(没有创建单点故障)的最佳方法是什么?

2 个答案:

答案 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;,您可以重新运行该过程。

如果在事务中包装语句(您可能执行比此示例更复杂的逻辑),则可以保证原子性。