Spring事务
一、没有添加事务的实现
1、实体类:
2、Dao:
3、Service:
4、XML文件配置:
5、测试:
6、结果:
没有事务管理,所以异常上面的代码成功执行,下面的代码不执行,导致钱转出去了,没收到,总金额少了!
二、编程式事务实现
1、XML配置事务:在applicationContext.xml中添加事务管理器和事务管理器模版的配置
2、注解方式配置事务:注解方式配置事务管理器和事务管理器模版
3、修改UserService,使用编程式事务完成事务管理:
我们将原子性业务实现代码全部放在配置的事务中:
4、再测试:
5、结果:
我们再次测试,因为所有的业务代码放入了事务类中执行,所以整体具有原子性,不会出错!
三、声明值事务实现
1、基于AspectJ XML方式:我们可以删除之前applicationContext.xml中的事务管理模版的配置,添加事务定义的配置和AOP的配置:
2、将业务类的方法改回原来的方式:
3、结果:
因为我们通过配置AOP实现切点方式织入,就会对对应类下对应方法实现事务处理,不会出错!
基于注解的声明式事务:
1、在配置类上配置@EnableTransactionManagement开启事务:
2、在UserService类上方或者方法上方通过@Transactional完成事务配置:
- 在类上加@Transactional则是在该类的所有方法上实现事务。
- 在方法上加@Transactional只是对该方法实现事务。
总结:
编程式事务实现:
- 通过xml配置或者通过配置类实现TransactionTemplate类,并将整体实现原子性的业务代码放入其exeute方法中执行,便能够实现事务!
- 需要自己写大量重复的事务控制代码
- 粒度可以更细,达到代码块级别
声明式事务处理:
- 通过配置AOP实现切点方式织入,就会对对应类下对应方法实现事务处理!
- 在配置类上配置@EnableTransactionManagement开启事务,并在需要实现事务的方法上添加@Transactional注解来实现事务!
- 不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中!
- 通过设置可以一次性给所有的业务方法添加上事务特性
- 最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别