我从过去几个月开始使用Spring框架。在下面的场景中,我有一个关于事务管理器如何工作的问题。
场景:我正在处理一个春季批处理,其中ItemReader多次调用下面的方法。此方法从处于“未完成”状态的“学生”表中获取记录列表,并将这些记录的状态更新为“正在进行”。我正在处理1000万条记录,因此我计划使用多个线程和多个JVM执行我的批处理过程。
解决方案到目前为止已经实现了:我已经实现了这个方法的同步,以确保在给定的时间只有单个线程获取记录,这样就不会有两个线程尝试获取相同的“未完成”记录。还添加了@Transactional,以便如果在此方法中出现任何问题,spring将回滚更改。
问题:事务管理如何与访问一个数据库的多个JVM一起工作?如果我正在运行我的应用程序的2-3个实例,那么如何确保这些实例不试图在状态“未完成”的情况下获取相同的记录?春天有这个特点吗?
@Transactional
public synchronized List<Student> processStudentRecords(){
List<Student> students = getNotCompletedRecords();
if(null != students && students.size() > 0){
updateStatusToInProgress(students);
}
return student;
}发布于 2019-02-26 15:37:20
为了具体地回答你的问题:
@Transactional。Spring批处理管理事务,使用该注释将导致问题。然而,上面的内容并没有回答多个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,同时保留诸如可重新启动之类的内容。
https://stackoverflow.com/questions/54888037
复制相似问题