如果你想寻求一份与后端相关的开发工作,那么关于Spring事务相关的面试题你就不能说不会并且不能不知道?
@人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?
一.Spring中声明事务的方式
1.1 编程式事务
编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现。
1.2 声明式事务
声明式事务属于无侵入式,不会影响业务逻辑的实现。基于@Transactional注解,事务传播级别基于该注解实现。
二.Spring事务的隔离级别?
2.1 Spring默认事务隔离级别
Spring默认的事务隔离是DEFAULT (默认),其作用的效果就是使用数据库默认的事务隔离级别。
Spring事物的隔离级别比数据库事务隔离级别多一个 Default。
2.2 Spring事务隔离级别分类
DEFAULT (默认)
这是一个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 MySQL的隔离级别相对应。READ_UNCOMMITTED (读未提交)
READ_COMMITTED (读已提交)
REPEATABLE_READ (可重复读)
SERIALIZABLE(串行化)
三.讲下嵌套事务?
3.1 嵌套事务的基本定义
嵌套事务:就是事务方法A调用事务方法B,外层调用方法和内层被调用方法都是事务方法的情况。
一般我们不关心外层调用方法的事务传播行为。而只关心内层被调用方法的传播行为。
3.2 嵌套事务的应用场景
- 外层调用方法和内层被调用方法,有异常一起回滚,没问题一起提交。(共用一个事务)
- 内层被调用方法回滚与否,不会影响外层调用方法。而外层调用方法出异常回滚,也不会回滚内层被调用方法(两个独立的事务)
- 内层被调用方法回滚与否,不会影响外层调用方法。而外层调用方法出异常回滚,也会回滚内层被调用方法(嵌套事务)
3.3 每种应用场景下对应的事务传播行为
@Transactional(propagation=Propagation.REQUIRED) :内外层方法共用外层方法的事务。
@Transactional(propagation=Propagation.REQUIRES_NEW) :当执行内层被调用方法时,外层方法的事务会挂起。两个事务相互独立,不会相互影响。
@Transactional(propagation=Propagation.NESTED) :外事务回滚,内事务也会回滚。
四.Spring事务传播行为有哪些呢?
4.1 基本概念
事务的传播行为(propagation)就是为了解决外层方法调用内层事务方法的各个情况的。
4.2 Spring默认隔离级别
Spring事务的传播级别默认是Propagation.REQUIRED级别。
4.3 Spring事务隔离级别分类
接下来我们就来看看Spring事务传播级别:
- Propagation.REQUIRED:支持当前事务,如果没有事务会创建一个新的事务
- Propagation.SUPPORTS:支持当前事务,如果没有事务的话以非事务方式执行
- Propagation.MANDATORY:支持当前事务,如果没有事务抛出异常
- Propagation.REQUIRES_NEW:创建一个新的事务并挂起当前事务
- Propagation.NOT_SUPPORTED:以非事务方式执行,如果当前存在事务则将当前事务挂起
- Propagation.NEVER:以非事务方式进行,如果存在事务则抛出异常
- Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作
4.4 Propagation.NESTED 与 Propagation.REQUIRES_NEW 的区别:
Propagation.NESTED 与 Propagation.REQUIRES_NEW 非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。
使用Propagation.REQUIRES_NEW 时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要 JTA 事务管理器的支持。
使用Propagation.NESTED 时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。
五.勉励
屏幕前的小伙伴,我想对你们说,也想对自己说,让我们抛弃忧虑,相信自己,慢一点,不要让自己过于功利,太急于求成,但行好事,莫问前程,你一定可以的,比心,我们一起加油!