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

发布于 2022-09-13 00:34:54 字数 194 浏览 32 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

戏剧牡丹亭 2022-09-20 00:34:54

两个思路供你参考:

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

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

酒中人 2022-09-20 00:34:54

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文