TransactionTemplate VS @transaction

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 最灵活。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值