vlambda博客
学习文章列表

面试会问的Spring事务相关的都在这里了

前言

Spring事务这块是挺基本的一个东西,面试的时候它的出场率很高很高,如果理解的不到位,回答的不好,那么给人的印象就是稍微复杂点的功能你没法胜任,只适合简单的CRUD操作。

但现在生成代码的工具如此之多,模板编辑好之后,简单的CRUD都不需要人工来写,那事务再整不明白……很明显就会收到:“你挺优秀的,但是不适合我们公司,期待以后有合作的机会”,“回去等通知吧”……

Spring事务的本质

首先,想一下当我们在没有使用Spring框架的时候,事务是如何处理的?是不是使用JDBC来操作事务呀,使用JDBC操作事务的步骤:

  • 获取数据库连接;
  • 开启事务;
  • 执行CRUD;
  • 提交或回滚事务;
  • 关闭连接

使用了Spring来管理事务之后,步骤就没那么复杂了,使用一个注解之后,我们就可以专注业务逻辑的编写了,让Spring的AOP来帮我们做一些重复性的工作。

所以说,「Spring事务的本质」就是对数据库事务的管理,如果数据库不支持事务,那么Spring也是无法提供事务功能的。

常见面试题

  1. Spring的事务隔离级别与数据库事务隔离级别是不是一个概念?

    答案:是同一个概念

  2. Spring配置的事务隔离级别是Repeatable Read,数据库配置的事务隔离级别是Read Commited,那这个时候隔离级别到底是什么?

    答案:以Spring配置的隔离级别为准,前提是数据库支持Spring配置的隔离级别,否则以数据库配置的为准

知识点解析:

① 理解了Spring事务的本质之后,第一道题不用多说,自然而然地就明白了;

② 源码里是这么写的,有兴趣的可以去看看源码

③ 数据库事务隔离级别:

  • Read uncommitted (读未提交):允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读;
  • Read committed (读已提交):允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
  • Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题;
  • Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生;

④ Spring事务隔离级别:

  • ISOLATION_DEFAULT:使用后端数据库默认的隔离级别;
  • ISOLATION_READ_UNCOMMITTED:对应数据库的Read uncommitted;
  • ISOLATION_READ_COMMITTED:对应数据库的Read committed;
  • ISOLATION_REPEATABLE_READ:对应数据库的Repeatable Read;
  • ISOLATION_SERIALIZABLE:对应数据库的Serializable;
  1. 在Service层,一个启用事务管理的方法去调用另外一个启用事务管理的方法,事务没有做特殊配置,请问这个时候会开启几个事务?

    答:开启一个事务,因为Spring默认的事务传播机制是PROPAGATION_REQUIRED,如果上下文中存在事务则加入当前事务,如果不存在事务则新建事务执行。

    Spring的事务传播机制有7种,我们不需要全部背下来,但是默认的需要知道,当对事务有特殊需求的时候,我们可以去查一下其他事务传播机制并选择合适的来使用。
  2. Spring事务什么情况下会失效?

    参考这篇文章:

  3. 怎么保证spring事务内的连接唯一性?

    答:为了保证connection的唯一,spring中开启事务的时候就将connection保存到ThreadLocal中 ,需要使用的时候就从ThreadLocal中去获取,保证了一个线程下面的操作拿到的连接是同一个对象。

  4. @Transactional注解都可以加在什么位置上?

    答:方法、类、接口上都可以加,一般都加在方法上,不推荐加在接口上,如果加在类上,则这个类下所有的public方法都走事务管理

长按/扫码关注我吧,会找到你想要的…… 

   喜欢就点个在看吧