【发布时间】:2019-02-27 15:22:46
【问题描述】:
我从过去几个月开始使用 spring,我有一个关于交易的问题。我的 spring 批处理作业中有一个 java 方法,它首先执行选择操作以获取状态为“未完成”的前 100 行,并对所选行进行更新以将状态更改为“进行中”。由于我正在处理大约 1000 万条记录,因此我想运行我的批处理作业的多个实例,并且每个实例都有多个线程。对于单个实例,为了确保两个线程没有获取同一组记录,我将我的方法设置为同步。但是,如果我运行批处理作业的多个实例(多个 JVM),即使我使用“乐观”或“悲观锁”或“选择更新”,这两个实例也很可能会获取同一组记录,因为我们无法在选择期间锁定记录。下面是显示的示例。事务 1 获取了 100 条记录,同时事务 2 也获取了 100 条记录,但是如果我启用锁定事务 2 等到事务 1 更新并提交。但是事务 2 再次执行相同的更新。
春天有什么办法让事务2的选择操作等到事务1的选择完成?
Transaction1 Transaction2
fetch 100 records
fetch 100 records
update 100 records
commit
update 100 records
commit
@Transactional
public synchronized List<Student> processStudentRecords(){
List<Student> students = getNotCompletedRecords();
if(null != students && students.size() > 0){
updateStatusToInProgress(students);
}
return student;
}
注意:我不能先更新再选择。如果建议任何替代方法,我将不胜感激?
【问题讨论】:
-
您是不是碰巧从应用程序本身解决了这个问题?自您发布问题一年以来,我仍然无法从春天找到实现这一目标的答案。
标签: spring spring-batch spring-transactions optimistic-locking pessimistic-locking