实现方式:
- 编程式
在代码中手动设置,比较细致
- 声明式
使用@Transactional注解,对该注解修饰方法开启事务
实现原理:
- 在一个方法上加了@Transactional注解后,Spring会基于这个类生成一个代理对象,会将这个代理对象作为bean提交到IOC容器中
- 在生成这个类的代理对象方法时,如果监测到这个方法上有@Transactional注解,那么代理逻辑会将事务自动提交设置为false
- 然后再去执行原来的业务方法时,如果原来的业务方法没有出现异常,代理逻辑就会将事务提交。如果出现异常,就会回滚。
- 所以说我们平时需要注意的是必须使用Spring容器中被代理的对象才能实现事务,否则事务会失效
扩展
其实事务的实现方式,编程式和声明式都不太好。
我们组接收的一个项目,就是因为对一个大方法加了@Transactional注解,导致事务过大,很多锁没有释放导致冲突引发思索。
最终解决方案是,写一个钩子函数,再钩子函数外部将数据组装好,只有IO操作才放入这个钩子函数。