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);
}
}
两者区别
- 编程式事务管理:
需要在代码中显式调用事务管理的API来控制事务的边界,比较灵活,但是代码侵入性较强,不够优雅。 - 声明式事务管理
使用Spring的AOP来声明事务,将事务管理代码从业务代码中分离出来。- 优点是代码简洁,易于维护。
- 缺点是不够灵活,只能在预定义的方法上使用事务。

浙公网安备 33010602011771号