对SpringBatch有所了解的同学都知道Batch是用来进行批量数据处理的。 但是我们在同时使用SpringJPA的时候,尤其是循环数据处理的时候,我们希望能够尽快提交事务。 但是,SpringBatch中,如果使用了Tasklet的话,那么Spring会在Tasklet级别创建一个事务。 在Tasklet不完成的情况下,事务是不会提交的。 这就需要对我们代码进行进行处理的时候,需要对数据量有多大有比较清楚的了解。 否则,非常容易遇到事务堆叠导致锁表的情况。解决办法 针对一个Tasklet只完成一个特定的工作,如果Job的处理数据比较多的话,需要分开不同的Tasklet来做。 如上图,哪怕我们在这里调用了不同的服务,调用了不同的数据层。 事务都是没有办法提交的。 简单的办法就是针对上面的操作使用不同的Tasklet来做。 有人问过,能不能在循环中一次一次的进行提交。 SpringBatch这样设计的目的就是为了保持数据的完整性,因此需要对Batch的逻辑进行考虑,而不建议考虑怎么省事怎么来。