Spring事务实现

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注解的方式),便可以将事务规则应用到业务逻辑中!
  • 通过设置可以一次性给所有的业务方法添加上事务特性
  • 最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别