面试会问的Spring事务相关的都在这里了
前言
Spring事务这块是挺基本的一个东西,面试的时候它的出场率很高很高,如果理解的不到位,回答的不好,那么给人的印象就是稍微复杂点的功能你没法胜任,只适合简单的CRUD操作。
但现在生成代码的工具如此之多,模板编辑好之后,简单的CRUD都不需要人工来写,那事务再整不明白……很明显就会收到:“你挺优秀的,但是不适合我们公司,期待以后有合作的机会”,“回去等通知吧”……
Spring事务的本质
首先,想一下当我们在没有使用Spring框架的时候,事务是如何处理的?是不是使用JDBC来操作事务呀,使用JDBC操作事务的步骤:
-
获取数据库连接; -
开启事务; -
执行CRUD; -
提交或回滚事务; -
关闭连接
使用了Spring来管理事务之后,步骤就没那么复杂了,使用一个注解之后,我们就可以专注业务逻辑的编写了,让Spring的AOP来帮我们做一些重复性的工作。
所以说,「Spring事务的本质」就是对数据库事务的管理,如果数据库不支持事务,那么Spring也是无法提供事务功能的。
常见面试题
-
Spring的事务隔离级别与数据库事务隔离级别是不是一个概念?
答案:是同一个概念
-
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;
-
在Service层,一个启用事务管理的方法去调用另外一个启用事务管理的方法,事务没有做特殊配置,请问这个时候会开启几个事务?
答:开启一个事务,因为Spring默认的事务传播机制是
PROPAGATION_REQUIRED
,如果上下文中存在事务则加入当前事务,如果不存在事务则新建事务执行。Spring的事务传播机制有7种,我们不需要全部背下来,但是默认的需要知道,当对事务有特殊需求的时候,我们可以去查一下其他事务传播机制并选择合适的来使用。
-
Spring事务什么情况下会失效?
参考这篇文章:
-
怎么保证spring事务内的连接唯一性?
答:为了保证
connection
的唯一,spring中开启事务的时候就将connection
保存到ThreadLocal
中 ,需要使用的时候就从ThreadLocal
中去获取,保证了一个线程下面的操作拿到的连接是同一个对象。 -
@Transactional
注解都可以加在什么位置上?答:方法、类、接口上都可以加,一般都加在方法上,不推荐加在接口上,如果加在类上,则这个类下所有的
public
方法都走事务管理
长按/扫码关注我吧,会找到你想要的……
喜欢就点个在看吧