我有一个有两个委托编写器的compositeItemWriter: 1. HeaderWriter将我的对象中的一些字段写入Header Table 2. DetailWriter将fileds写入详细信息表。
问题是,当DetailWriter中发生异常时,数据不会从Headerwriter回滚。看起来数据正在2个不同的交易中更新。 如何通过在同一事务中同时进行更新来强制执行数据完整性?
仅供参考,我正在使用Informix并且必须将一些Spring批处理类扩展到 让Spring在Informix上工作。
我的配置如下:
来自reportjob.xml的部分:
<bean id="programHeaderWriter"
class="com.bah.discrepancy.writer.ProgramHeaderWriter">
<property name="dataSource" ref="dataSource" />
<property name="itemSqlParameterSourceProvider">
<bean
class="com.bah.discrepancy.parametermapper.ProgramHdrParameterMapper"/>
</property>
</bean>
<bean id="programDetailWriter"
class="com.bah.discrepancy.writer.ProgramDetailWriter">
<property name="dataSource" ref="dataSource" />
<property name="itemSqlParameterSourceProvider">
<bean
class="com.bah.discrepancy.parametermapper.ProgramDetailParamMapper" />
</property>
</bean>
Context.xml:
<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransaction
Manager" />
<bean id="batchDefaultSerializer"
class="org.springframework.batch.core.repository.dao.
DefaultExecutionContextSerializer" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.informix.jdbc.IfxDriver"
/>
<property name="url" value="<URL>" />
<property name="username" value="<UserID>" />
<property name="password" value="<Password>" />
</bean>
<bean id="jobRepository"
class="com.bah.batch.informixsupport.InformixJobRepositoryFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="databaseType" value="Informix"/>
<property name="incrementerFactory" ref="informixIncrementer"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="tablePrefix" value="BATCH_" />
</bean>
答案 0 :(得分:0)
希望这次肯定会得到解决。但只是想检查一下你是否以下列方式或任何其他方式解决了问题?
Spring Batch CompositeItemWriter Transaction Roll back issue