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

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

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

阅读 5.2k
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;//此处是开辟了一个新事务
  }
}

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题