spring batch 之 编程事务

本文介绍Spring Batch中的事务管理机制,特别是在使用自定义writer时如何确保数据一致性和事务同步。通过TransactionTemplate和DataSourceTransactionManager实现对数据库操作的事务控制。
Spring batch 的writer有本身自己的事务:
比如读取txt文件到第几行了,写到第几行了,step做到哪里了?读了几行需要提交了?这些信息都会写入到数据库中去。

而我们自己的writer也会写数据到数据库中去,这里就有一个transaction同步的问题。
SPRING 的基础设施就很好的解决了这个问题。

看如下代码:

/**
* @see ItemWriter#write(Object)
*/
public void write(List<? extends Object> data) throws Exception {
TestBean rs=null;
for(Object line : data){
rs=(TestBean)line;
}

final Object[] params=new Object[2];
params[0]=rs.getName();
params[1]=rs.getAge();
System.out.println(ToStringBuilder.reflectionToString(rs));


TransactionTemplate transactionTemplate = new TransactionTemplate(new DataSourceTransactionManager(dataSource));
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus arg0) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into BATCH_TEST(NAME,AGE) VALUES(?,?)",params);
return null;
}
});

}


Spring的transaction的关于jdbc数据源的处理基本有下面两部分组成:
transactionTemplate: 用于组织事务。
DataSourceTransactionManager:用于同步框架中的事务,其实利用的是localthread
dataSource 是管理connection的。
jdbcTemplate 用来执行相应的sql。
### Spring Batch 事务管理的配置与使用方法 Spring Batch 提供了强大的事务管理机制,可以确保批处理任务在执行过程中保持数据一致性与完整性。事务管理在 Spring Batch 中主要依赖于 Spring 框架事务支持,通过 `PlatformTransactionManager` 接口进行管理。以下是关于事务管理的具体配置与使用方法。 #### 1. 配置事务管理器 在 Spring Batch 中,首先需要配置一个事务管理器(`TransactionManager`)。通常使用 `DataSourceTransactionManager` 来管理 JDBC 数据源的事务。以下是一个典型的事务管理器配置示例: ```xml <!-- 创建事务管理器对象 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> ``` 该配置声明了一个事务管理器,并将其与数据源绑定,以便在批处理任务中管理事务。 #### 2. 声明事务属性 接下来,需要定义事务的属性,例如事务的传播行为、隔离级别、超时时间等。可以通过 `<tx:advice>` 标签来配置事务属性: ```xml <!-- 配置需要添加事务对应的方法的属性设置 --> <tx:advice id="interceptor" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> ``` 上述配置表示对所有方法应用默认的事务属性。可以根据需要为特定方法指定不同的事务属性。 #### 3. 配置 AOP 实现事务管理 为了将事务管理应用到具体的业务逻辑中,需要通过 AOP(面向切面编程)来实现。可以通过 `<aop:config>` 标签来配置切面和切点: ```xml <!-- 实现事务的AOP配置 --> <aop:config> <aop:pointcut id="pt" expression="execution(* com.feri.ssm.service.impl.*.*Batch(..))"/> <aop:advisor advice-ref="interceptor" pointcut-ref="pt"/> </aop:config> ``` 该配置定义了一个切点 `pt`,它匹配 `com.feri.ssm.service.impl` 包下所有以 `Batch` 结尾的方法,并将事务管理器 `interceptor` 应用于这些方法。 #### 4. 在批处理任务中使用事务Spring Batch 中,事务管理通常与 `Step` 结合使用。每个 `Step` 可以配置一个事务管理器,并通过 `chunk` 元素指定事务的提交间隔。以下是一个典型的 `Step` 配置示例: ```xml <batch:job id="importProductsJob"> <batch:step id="readWrite"> <batch:tasklet transaction-manager="transactionManager"> <batch:chunk commit-interval="100" skip-limit="10"> <skippable-exception-classes> <include class="org.springframework.batch.item.file.FlatFileParseException"/> <exclude class="java.io.FileNotFoundException"/> </skippable-exception-classes> </batch:chunk> </batch:tasklet> </batch:step> </batch:job> ``` 在该配置中,`transaction-manager` 属性指定了使用事务管理器,`commit-interval` 属性表示每处理 100 条记录提交一次事务。此外,还可以通过 `<skippable-exception-classes>` 配置可跳过的异常类,以便在发生特定异常时继续执行任务。 #### 5. 事务的提交与回滚 Spring Batch 支持事务的提交与回滚操作。在正常情况下,事务会在处理完指定数量的记录后自动提交。如果在处理过程中发生异常,并且该异常未被标记为可跳过,则事务将回滚到最近一次提交的状态,以确保数据的一致性。 #### 6. 事务的并发控制 Spring Batch 还支持并发处理,可以通过配置多个线程来并行执行任务。然而,在并发环境下,事务管理变得更加复杂。为了确保数据一致性,需要合理设置事务的隔离级别,并避免多个线程同时修改相同的数据。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值