面试突击:说一下 Spring 事务传播机制?

网站建设2年前发布
42 00

面试突击:说一下 Spring 事务传播机制?,Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。,既然是“事务传播”,所以事务的数量应该在两个或两个以上,Spring 事务传播机制的诞生是为了规定多个事务在传播过程中的行为的。比如方法 A 开启了事务,而在执行过程中又调用了开启事务的 B 方法,那么 B 方法的事务是应该加入到 A 事务当中呢?还是两个事务相互执行互不影响,又或者是将 B 事务嵌套到 A 事务中执行呢?所以这个时候就需要一个机制来规定和约束这两个事务的行为,这就是 Spring 事务传播机制所解决的问题。,Spring 事务传播机制可使用 @Transactional(propagation=Propagation.REQUIRED) 来定义,Spring 事务传播机制的级别包含以下 7 种:,以上 7 种传播机制,可根据“是否支持当前事务”的维度分为以下 3 类:,面试突击:说一下 Spring 事务传播机制?,看到这里,有人可能会说:说了这么多,我也看不懂啊,即使看懂了,我也记不住啊?这要咋整?,没关系,接下来我们用一个例子,来说明这 3 类事务传播机制的区别。,以情侣之间是否要买房为例,我们将以上 3 类事务传播机制可以看作是恋爱中的 3 类女生类型:,这三类女生如下图所示:,面试突击:说一下 Spring 事务传播机制?,支持当前事务的“女生”,这里的事务指的是“房子”,它分为 3 种(普通型女生):,不支持当前事务的“女生”也分为 3 种(强势型或者叫事业型):,最后一种是嵌套性事务 Propagation.NESTED,它属于懂事型女友,如果有房子了就以房子为基础做点小生意,卖个花生、水果啥的,如果买卖成了,那就继续发展;如果失败了,至少还有房子;如果没房子也没关系,一起赚钱买房子。,接下来我们演示一下事务传播机制的使用,以下面 3 个最典型的事务传播级别为例:,下来我们分别来看。,事务传播机制的示例,需要用到以下两张表:,创建一个 Spring Boot 项目,核心业务代码有 3 个:UserController、UserServcie 以及 LogService。在 UserController 里面调用 UserService 添加用户,并调用 LogService 添加日志。,REQUIRED 支持当前事务。,UserController 实现代码如下,其中 save 方法开启了事务:,UserService 实现代码如下:,LogService 实现代码如下:,执行结果:程序报错,两张表中都没有插入任何数据。,执行流程描述:,REQUIRED_NEW 不支持当前事务。,UserController 实现代码:,UserService 实现代码:,LogService 实现代码:,程序执行结果:,User 表中成功添加了一条用户数据,Log 表执行失败,没有加入任何数据,但它并没有影响到 UserController 中的事务执行。,通过以上结果可以看出:LogService 中使用的是单独的事务,虽然 LogService 中的事务执行失败了,但并没有影响 UserController 和 UserService 中的事务。,NESTED 是嵌套事务。,UserController 实现代码如下:,UserService 实现代码如下:,LogService 实现代码如下:,最终执行结果,用户表和日志表都没有添加任何数据。,执行流程描述:,Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY;不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

© 版权声明

相关文章