java - Spring 批处理、XA 和本地事务

标签 java spring transactions spring-batch distributed-transactions

是否可以在 Spring Batch 中使用 jobRepository 来使用本地事务,但在分布式 XA 事务中执行特定作业步骤?

对于 XA,我使用 Atomicos 3.8.0。步骤应该读取JMS消息并在处理后更新数据库。

spring配置的相关部分:

<job id="job" xmlns="http://www.springframework.org/schema/batch">
     <step id="inventorySync">
         <tasklet transaction-manager="xaTransactionManager">
            <chunk reader="jmsQueueReader"
                   processor="messageProcessor"
                   writer="dbWriter"
                   reader-transactional-queue="true"/>
         </tasklet>
     </step>
</job> 

    <bean id="xaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"
          lazy-init="true" depends-on="inventoryDataSource">
        <constructor-arg name="transactionManager" ref="userTransactionManager"/>
        <constructor-arg name="userTransaction" ref="userTransaction"/>
        <property name="allowCustomIsolationLevels" value="true"/>
    </bean>

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="batchJobsDataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseType" value="${batch.data.source.type}"/>
</bean>

    <jdbc:embedded-database id="batchJobsDataSource" type="HSQL"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="batchJobsDataSource"/>
    </bean>

最佳答案

在单元测试中成功使用 Bitronix 并在生产中使用 WebSphere JTA 之前,我已在所有 3 个资源中使用了 XA 事务。如果批处理数据库与步骤的其余部分有一个单独的事务管理器,则如果任一位置(批处理数据库或步骤)发生故障,则步骤和批处理数据库将面临“不同步”的风险)。

例如,您的步骤(JMS 和 DB)可能成功提交,但批处理数据库失败。当您重新启 Action 业时,它会认为某个步骤不成功,而您的底层执行却成功。在同一个事务管理器中覆盖所有 3 个资源将防止这种情况发生。

关于java - Spring 批处理、XA 和本地事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369876/

相关文章:

sql - 事务空闲并使用 PostgreSQL 锁定

java - Guice,绑定(bind)到枚举

java - Android:拆分功能不起作用

spring - 为什么bean(具有请求范围)没有在 Controller 的每个请求中初始化?

java - Spring RestTemplate with rootUri 返回 URI 不是绝对错误

ruby-on-rails - 如何在不启动 Rails 事务的情况下运行迁移?

java - Neo4j Java 驱动程序事务似乎未提交

java - 我正在寻找处理堆内存 Java 应用程序中重复字符串的最佳方法?

java - 我对这个 JUnit 测试用例感到困惑

spring - Spring 服务中的 Drools XStream