Spring 提供多种方式进行事务管理
- 基于 TransactionDefinition、PlatformTransactionManager、TransactionStatus 编程式事务管理是 Spring 提供的最原始的方式
- 基于 TransactionTemplate 的编程式事务管理是使用模板设计模式对上一种方式的封装,使得编码更简单、清晰。
- 基于 @Transactional 的方式将声明式事务管理简化到了极致。
TransactionTemplate 配置
- TransactionTemplate 方式
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
public boolean transfer(final Long fromId, final Long toId, final double amount) {
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status) {
Object result;
try {
result = bankDao.transfer(fromId, toId, amount);
} catch (Exception e) {
status.setRollbackOnly();
result = false;
System.out.println("Transfer Error!");
}
return result;
}
});
@transaction配置
参考上面,仅需要配置transactionManager
比较
- 编程式的TransactionTemplate 会和逻辑代码糅合在一起,可以在方法内更精准的控制事务单元,更加的灵活方便。相比@transaction 如果要实现精准控制复杂逻辑的事务,则需要将dao批量操作的逻辑,抽离到DAO层的方法中,才可达到精准控制的目的。
ps:
1)如果在复杂逻辑(包含外部接口调用、效率低的数据转换或组装等操作)的方法上添加@transaction注解,将会使此事务占用较长时间的数据库连接,从而影响数据库的吞吐量。
2)如果复杂业务逻辑中需要更新的对象比较多,可以添加对应的包装UpdateVO,在对应的DAO方法中做更新
3)本着的原则,就是事务影响最小化
- 总结起来是:@transaction注解方式最简单明了,TransactionTemplate 最灵活。