我目前正在尝试调查我的 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]
完成事务听起来像是已提交事务。我在日志中看到许多类似的语句,这是否意味着我的批处理作业正在创建许多事务?实际上,我希望批处理作业元数据更新包含在单个事务中。
有没有人能解释一下。提前感谢!
1条答案
按热度按时间vfhzx4xs1#
在每个块之后进行提交。Tasklet(不基于块)的块大小始终为1。这就是Tasklet(不基于块)的提交计数为1的原因