Java多线程重复读取数据库的同一份数据

Yang_SH
  • 183

Java多线程重复读取数据库的同一份数据

现有业务:定时任务每两分钟读取20条(状态为未读取)数据库中待处理的数据,将查询到的数据都设置成已读取状态,之后在处理数据。
问题:前后两个任务中读取到了同一份数据,导致数据处理了两次
求助大佬???

回复
阅读 1.3k
3 个回答

两个思路供你参考:

  1. 如果读取速度很快,处理时间长,完全可以改一个线程读取数据,分派给多个线程处理。
  2. 如果处理很快,需多线程,甚至多个机器、实例读取的话,那要先对数据做线程标记,再读取标记成功的数据做处理,即悲观锁的原理。

将此方法的事务设置为可重复读。或者悲观加锁。

正好我也有和你一样的问题,用的spring quartz。给你看下我的方案
伪代码

list =getRecords();
for(l:list){
  int num=l.updateBeginFlag; //此处是开辟了一个新事务
  if(num<1) continue;
  try{
      //TODO 逻辑处理
      l.updateSuccessFlag;//此处是开辟了一个新事务
  }catch(Exception){
      l.updateFailFlag;//此处是开辟了一个新事务
  }
}

这种是针对乐观锁的优化,可以保证不会重复,并且不用空跑流程代码再回滚。

宣传栏