Spring batch Spring批处理:我需要事务性注释吗?
我有一个Spring批处理应用程序,配置了一个Spring batch Spring批处理:我需要事务性注释吗?,spring-batch,Spring Batch,我有一个Spring批处理应用程序,配置了一个SkipPolicy,这样如果一条记录不能插入,整个批处理就不会失败。但行为似乎并非如此。当向数据库中插入失败时,Postgresql表示事务“不正确”,所有命令都将中止。因此,以下所有插入数据库的操作也会失败。Spring应该一次重试一条记录,我想 所以我们想知道问题是否是因为我们用@Transactional标记了服务方法?我应该让Spring批处理控制事务吗?以下是我的作业配置: <bean id="stepScope"
SkipPolicy
,这样如果一条记录不能插入,整个批处理就不会失败。但行为似乎并非如此。当向数据库中插入失败时,Postgresql表示事务“不正确”,所有命令都将中止。因此,以下所有插入数据库的操作也会失败。Spring应该一次重试一条记录,我想
所以我们想知道问题是否是因为我们用@Transactional标记了服务方法?我应该让Spring批处理控制事务吗?以下是我的作业配置:
<bean id="stepScope" class="org.springframework.batch.core.scope.StepScope">
<property name="autoProxy" value="true"/>
</bean>
<bean id="skipPolicy" class="com.company.batch.common.job.listener.BatchSkipPolicy"/>
<bean id="chunkListener" class="com.company.batch.common.job.listener.ChunkExecutionListener"/>
<batch:job id="capBkdnJob">
<batch:step id="capStep">
<tasklet throttle-limit="20">
<chunk reader="CapReader" processor="CapProcessor" writer="CapWriter" commit-interval="50"
skip-policy="skipPolicy" skip-limit="10">
<batch:skippable-exception-classes>
<batch:include class="com.company.common.exception.ERDException"/>
</batch:skippable-exception-classes>
</chunk>
<batch:no-rollback-exception-classes>
<batch:include class="com.company.common.exception.ERDException"/>
</batch:no-rollback-exception-classes>
<batch:listeners>
<batch:listener ref="chunkListener"/>
</batch:listeners>
</tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="batchWorkerJobExecutionListener"/>
</batch:listeners>
</batch:job>
简短的回答是:没有
Spring批处理将使用默认情况下定义为
作业存储库
一部分的事务管理器。这将允许它在遇到错误时回滚整个区块,然后在自己的事务中分别重试每个项目。谢谢!我现在正在删除所有批注。您可能仍然希望它出现在@服务
或@存储库
中,但它对任何读卡器/处理器/编写器都是隐式的。我们在编写器调用的服务中使用了它。把它们也拿出来?我会把它从你的ItemWriter
中删除,但要把它保存在你的@服务
类中。这告诉事务管理器作为封装事务的一部分执行操作。