java Spring批处理非事务性步骤的提交计数为1

jjhzyzn0  于 2023-02-21  发布在  Java
关注(0)|答案(1)|浏览(104)

我目前正在尝试调查我的 Spring 批处理作业的事务总数。
正如我所看到的,StepExecution有一个属性commit_count,它告诉我们该步骤提交了多少事务。
我的工作包括两个步骤:

  • 读取文件并将内容Map到Java对象(=应该是非事务性的,对吗?)
  • 这一步使用了一个Tasklet,它只被调用一次。所以根据我的理解,只会为此创建一个事务。基本上,这一步对创建的对象做一些特定的处理,然后将它们持久化到数据库中(=应该是事务性的,对吗?)

在执行我的步骤之后,我可以看到两个步骤的commit_count都为1。
但是我只期望第二步的commit_count为1,另一步的commit_count应该为0,对吗?
我知道,除了业务事务之外,Spring还做了一些事务性的东西,以便持久化作业和步骤执行元数据等,但我在网上读到,从技术上讲,这并没有 Package 在事务中,因此我不希望它包含在步骤的commit_count中,对吗?
为了查看提交的事务总数,我还尝试配置logging.level.org.springframework.transaction.interceptor: TRACE,但这只会记录大量以下日志语句

Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.update]
Getting transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext]

完成事务听起来像是已提交事务。我在日志中看到许多类似的语句,这是否意味着我的批处理作业正在创建许多事务?实际上,我希望批处理作业元数据更新包含在单个事务中。
有没有人能解释一下。提前感谢!

vfhzx4xs

vfhzx4xs1#

在每个块之后进行提交。Tasklet(不基于块)的块大小始终为1。这就是Tasklet(不基于块)的提交计数为1的原因

相关问题