Spring 事务
热门问题
- Spring 事务有几个隔离级别?
- 什么是 Spring 的事务传播行为?
- Spring 事务失效的场景?
见招拆招
1、Spring 事务的隔离级别
和 MySQL 一样的嘛,如果在 Spring 中,没有指定的话,使用底层数据库的默认隔离级别。
说实话,列举这些没有什么意义,你要给面试官这样说:
Spring 的事务隔离级别的话,其实和数据库是一样的,如果没有进行指定的话,那么和数据库默认的隔离级别保持一致。在 Spring 中指定隔离级别,其实就是修改 JVM 与 MySQL 建立会话连接的事务隔离级别。
2、Spring 的事务传播行为
不要上菜单,说几个常用的就行了:
如果我没有记错的话,Spring 是的事务传播行为有 7 种,但是有一些不常用的我也没有太去关注。我这里说一下我了解的吧:
第一个是 REQUIRED :如果当前存在事务,则加入,否则就创建一个新的,这是默认的事务传播行为。
然后是 REQUIRES_NEW :这个就是无论是否在事务中,都会创建一个新的事务。如果当前存在事务,则挂起当前事物。
其他的也只是做了解,记不太清了,定义传播行为的话,在 @Transactional 注解的 propagation 属性指定即可。
3、Spring 事务失效的场景
其实还是蛮多的,我说一下我了解平时一些常见的吧,
第一个就是 在非public方法中使用@Transactional注解,因为 Spring 的事务管理是基于 AOP 实现的,而 AOP 底层无论是 JDK的动态代理 还是 Cglib 的动态代理,都只会代理 public 方法。如果事务方法的方位修饰符不是 public ,Spring AOP 无法正确地代理该方法,导致事务失效。
解决方法也很简单,将需要被事务管理的方法设置为public即可。
还有就是 在同类中的非事务方法中调用事务方法 ,前面也提到过,Spring的事务管理是通过动态代理实现的,只有通过代理对象调用的方法才能进行事务管理,所以在这种场景下,Spring 的事务也会失效。
这个解决起来稍微麻烦一些,可以调整代码结构,尽量将事务方法放在不同类中,或者获取当前的代理对象,然后调用事务方法。
其他的一些就比较不常见了,比如说:异常类型不匹配、配置不当等,这就需要根据实际的场景来分析了。
2025/01/06
writeBy kaiven