SPRING BATCH:嵌套异常是java.sql.SQLException:ORA-08177:无法序列化此事务的访问

时间:2016-02-18 17:22:24

标签: oracle oracle11g transactions spring-batch spring-aop

当我们尝试同时运行多个职位时,我们正面临上述问题。

以下是spring批处理作业中的一个tasklet的功能。

Tasklet1:为外部系统A生成消息,保留消息ID,向外部系统发送消息,停止弹出批处理作业(我正在停止此作业,因为我无法控制外部系统,I我不知道何时会收到系统的回复)

以下是始终在监听外部系统响应的监听器。

listener1 -listener侦听来自外部系统A的响应,收到响应时刻,侦听器类通过在DB中保留作业ID重新启动相同的作业。

如果我运行一两个工作,它就会完成而没有任何问题,但是如果我尝试并行运行20个工作,那么至少有5个工作因标题中提到的上述异常而失败。

我不知道我该怎么做才能完成所有工作。

我已经改变了#34;隔离级别的创建"到" READ_COMMITTED"那对我没用。

任何帮助都将受到高度赞赏。

感谢。

更新:我尝试为作业存储库创建bean并使用aop,如下所示。

<aop:config>
        <aop:pointcut id="allRepositoryMethods"
            expression="execution(* org.springframework.batch.core..*Repository+.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allRepositoryMethods" />
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" isolation="READ_COMMITTED" />
        </tx:attributes>
    </tx:advice>

但是这会引发错误

  

&#34; IllegalStateException在JobRepository中检测到现有事务。   请修复此问题并重试(例如,删除@Transactional注释   来自客户)&#34;

我确保在所有方法中删除 @Transactional ,但我仍然遇到上述错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

JobRepositoryFactoryBean.isolationLevelForCreate应设置为'ISOLATION_READ_COMMITTED'的值,而不仅仅是'READ_COMMITTED'

答案 1 :(得分:0)

是的,下面的内容不会起作用:

jobRepositoryFactoryBean.setIsolationLevelForCreate(Isolation.READ_COMMITTED.toString());

我们需要包含ISOLATION_READ_COMMITTED来设置值。

jobRepositoryFactoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");

这将有效!!!