(面试题)Spring事务的实现方式和实现原理

379 阅读1分钟

实现方式:

  • 编程式

在代码中手动设置,比较细致

  • 声明式

使用@Transactional注解,对该注解修饰方法开启事务

实现原理:

  1. 在一个方法上加了@Transactional注解后,Spring会基于这个类生成一个代理对象,会将这个代理对象作为bean提交到IOC容器中
  2. 在生成这个类的代理对象方法时,如果监测到这个方法上有@Transactional注解,那么代理逻辑会将事务自动提交设置为false
  3. 然后再去执行原来的业务方法时,如果原来的业务方法没有出现异常,代理逻辑就会将事务提交。如果出现异常,就会回滚。
  4. 所以说我们平时需要注意的是必须使用Spring容器中被代理的对象才能实现事务,否则事务会失效

扩展

其实事务的实现方式,编程式和声明式都不太好。

我们组接收的一个项目,就是因为对一个大方法加了@Transactional注解,导致事务过大,很多锁没有释放导致冲突引发思索。

最终解决方案是,写一个钩子函数,再钩子函数外部将数据组装好,只有IO操作才放入这个钩子函数。