Spring batch Spring批处理:我需要事务性注释吗?

Spring batch Spring批处理:我需要事务性注释吗?,spring-batch,Spring Batch,我有一个Spring批处理应用程序,配置了一个SkipPolicy,这样如果一条记录不能插入,整个批处理就不会失败。但行为似乎并非如此。当向数据库中插入失败时,Postgresql表示事务“不正确”,所有命令都将中止。因此,以下所有插入数据库的操作也会失败。Spring应该一次重试一条记录,我想 所以我们想知道问题是否是因为我们用@Transactional标记了服务方法?我应该让Spring批处理控制事务吗?以下是我的作业配置: <bean id="stepScope"

我有一个Spring批处理应用程序,配置了一个
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
中删除,但要把它保存在你的
@服务
类中。这告诉事务管理器作为封装事务的一部分执行操作。