首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个JVM上运行的spring应用程序中启用事务管理

如何在多个JVM上运行的spring应用程序中启用事务管理
EN

Stack Overflow用户
提问于 2019-02-26 14:43:48
回答 1查看 341关注 0票数 0

我从过去几个月开始使用Spring框架。在下面的场景中,我有一个关于事务管理器如何工作的问题。

场景:我正在处理一个春季批处理,其中ItemReader多次调用下面的方法。此方法从处于“未完成”状态的“学生”表中获取记录列表,并将这些记录的状态更新为“正在进行”。我正在处理1000万条记录,因此我计划使用多个线程和多个JVM执行我的批处理过程。

解决方案到目前为止已经实现了:我已经实现了这个方法的同步,以确保在给定的时间只有单个线程获取记录,这样就不会有两个线程尝试获取相同的“未完成”记录。还添加了@Transactional,以便如果在此方法中出现任何问题,spring将回滚更改。

问题:事务管理如何与访问一个数据库的多个JVM一起工作?如果我正在运行我的应用程序的2-3个实例,那么如何确保这些实例不试图在状态“未完成”的情况下获取相同的记录?春天有这个特点吗?

代码语言:javascript
复制
@Transactional
public synchronized List<Student> processStudentRecords(){
List<Student> students = getNotCompletedRecords();
if(null != students && students.size() > 0){
    updateStatusToInProgress(students);
}
return student;
}
EN

回答 1

Stack Overflow用户

发布于 2019-02-26 15:37:20

为了具体地回答你的问题:

  1. 不要在Spring使用的组件上使用@Transactional。Spring批处理管理事务,使用该注释将导致问题。
  2. 若要使用流程指示符标志(正如您提议的那样),您需要在选择之前进行更新。select只应查询可用于处理已标记的记录。

然而,上面的内容并没有回答多个JVM的问题。我假设您在跨多个JVM的处理中使用某种类型的远程分区。如果是这样的话,您的更新查询将类似于UPDATE STUDENTS SET FLAG = 'NOT COMPLETE' WHERE ID > ? AND FLAG IS NULL LIMIT 100,其中ID是分区范围的开始,而100是块大小。

一旦对行进行了标记,ItemReader就可以通过类似于SELECT * FROM STUDENT WHERE ID > ? AND FLAG = 'NOT COMPLETE'的内容进行查询,其中ID是分区范围的开始。

上述技术允许您扩展到多个JVM,同时保留诸如可重新启动之类的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54888037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档