Spring事务有2类 编程式事务管理 + 声明式事务管理

Spring中,事务有2类

声明式事务管理和编程式事务管理

编程式事务管理

编程式事务,使用TransactionTemplate和PlatformTransactionManager实现,需要显示地执行事务。(允许在代码中直接控制事务的边界,通过编程方式明确指定事务的开始、提交和回滚。

public class AccountService{
    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    public void transfer(final String out, final String in, final Double money) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult(){
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status){
                // 转出
                accountDao.outMoney(out,money);
                // 转入
                accountDao.inMoney(in,money);
            }
        });
    }
}

使用TransactionTemplate实现编程式事务,通过execute方法来执行事务,这样就可以在方法内部实现事务的控制。

声明式事务管理

  • 声明式事务管理建立在AOP之上。本质通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中。
  • 也就是在目标方法开始之前启动一个事务,在目标方法执行完之后根据执行情况提交 或者回滚事务。

相对于编程式事务,

  • 优点是 不需要在业务逻辑代码中掺杂事务管理的代码,Spring推荐通过@Transactional注解的方式来实现声明式事务管理。

  • 不足的地方,声明式事务管理最细粒度只能作用到 方法级别,无法像编程式事务那样可以作用到代码块级别。

@Service
public class AccountService2 {
    @Autowired
    private AccountDao accountDao;

    @Transactionl
    public void transfer(String out, String in, Double money) {
        // 转出
        accountDao.outMoney(out, money);
        // 转入
        accountDao.inMoney(in, money);
    }
}

两者区别

  1. 编程式事务管理:
    需要在代码中显式调用事务管理的API来控制事务的边界,比较灵活,但是代码侵入性较强,不够优雅。
  2. 声明式事务管理
    使用Spring的AOP来声明事务,将事务管理代码从业务代码中分离出来。
    • 优点是代码简洁,易于维护。
    • 缺点是不够灵活,只能在预定义的方法上使用事务。
posted @ 2025-05-10 12:24  kuki'  阅读(42)  评论(0)    收藏  举报