文章目录
- 1.Spring事务简介
- 2.案例
- 3.步骤
- 3.1 添加注解@Transactional
- 3.2 定义事务管理器
- 3.3 @EnableTransactionManagement开启事务驱动
- 4.事务管理员和事务协调员
1.Spring事务简介
可以在业务层上开的一种事务,开在业务层上的好处是,可以将业务层中方法里面所包含的数据层操作放到一个事务中进行管理,让他们同成功、同失败
2.案例
此案例休要开启事务管理,保证当一个账户的钱转向另外一个账户时,不能出现成功一半然后钱丢失的情况。实现事务回滚保证让他们同成功、同失败。一个账户转出100元,保证另外一个账户收到100元,或者转出失败,两者账户的钱都不减少。
3.步骤
3.1 添加注解@Transactional
在要添加事务管理的方法接口上添加注解@Transactional
3.2 定义事务管理器
在JdbcConfig配置类中定义一个新的事务管理器transactionManager,并将此事务管理器交给spring容器进行管理。
3.3 @EnableTransactionManagement开启事务驱动
在SpringConfig配置类中开启注解式事务驱动
4.事务管理员和事务协调员
事务角色
- 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
- 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法
transer方法为业务层的一个方法,他们调用数据层的两个方法outMoney和inMoney两个方法,由于这两方法属于数据层方法,并且属于增删改操作,因此他们在执行的时候都要开启对应的事务,第一个数据层方法,要开启一个事务,第二个数据层方法也要开启一个事务,由于是不同的事务,当第二个事务出现问题的时候,第一个操作会加入它的回滚么?答案是不会的,因此就会出现了一个状况,我们整个业务层中如果出现了异常,他们谁都不去回滚。在业务层方法上加上注解@Transactional,这句话代表开启了Spring事务,此时两个数据层的事务会加入Spring的事务当中。现在整个程序中就一个事务了。正因为只有一个事务,所以在它的范围内一旦出现了异常,就可以做到将所有操作同成功、同失败。
如果mybatis配置文件中的dataSource和jdbc配置文件中的dataSource不是同一个的话,那么上面例子中数据层的两个事务加入到spring中的事务这个事情是做不成的。正因为他们用了同一个dataSource所以他们才能做到统一管理。这也是它问什么叫DataSourceTransactionManager这个名字的原因,它是通过相同的数据源进行管理的