Spring事务(事务的实现、隔离级别、传播机制)(下)

简介: Spring事务(事务的实现、隔离级别、传播机制)(下)

三、Spring事务传播机制

1、事务的隔离级别及传播机制的引入

Spring 中事务隔离级别包含以下 5 种

1. Isolation.DEFAULT:以连接的数据库的事务隔离级别为主。

2. Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。

3. Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。

4. Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。

5. Isolation.SERIALIZABLE:串⾏化,可以解决所有并发问题,但性能太低


从上述介绍可以看出,相⽐于 MySQL 的事务隔离级别,Spring 的事务隔离级别只是多了⼀个
Isolation.DEFAULT(以数据库的全局事务隔离级别为主)

b633bef7661e4f92979d0d4b7dc00f48.png

为什么需要事务的传播机制

  • 事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的).
  • 而事务传播机制,是保证⼀个事务在多个调⽤⽅法间的可控性的(稳定性的)


Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的

我们之前学习的事务都很简单,都是单个的事务。

各个事务之间是没有关联关系,并且不存在相互调用的情况。

但是!这种美好的情况,只是发生在 我们学习 Spring 框架之前。

之前我们的事务 是在数据库里面去操作的,没有问题!

单个事务,很简单。很纯粹!


但是呢,我们现在到了具体的业务方法里面,具体框架里面,它的业务场景就会变成复杂很多!

就比如:A方法调用 B 方法,B方法里面又调用了 C 方法。。。。

ABC。。。都有事务.

现在问你: 事务,它应该怎么样进行传递 和 怎么样去执行。

是每个事务各自运行,互不影响;

还是几个事务 组成一个大事务;

还是说,我不以事务的方式执行。

这种可能性是完全可能存在的。

比如:

A 调用 B,B 调用 C,C 调用 D.

然后呢,A有事务,B有事务,C 没事务,D 有事务。

好,这个时候,我们该怎么办?

我的事务要不要传,毕竟 C 没有事务,中间 “ 断了 ”。

这样的话,情况就异常复杂了。

这就是一个应用级程序 的 特性。

这东西很复杂!

因为 它没有那么纯粹,没有那么简单!

这时就用到我们事务的传播机制了

2、事务的传播机制

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的


Spring 事务传播机制包含以下 7 种:

d132d11c81504ca680f247763dc98901.png

1、 Propagation.REQUIRED:

默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。

这就跟现在结婚的现状是一样的,房子(事务)是必须项、

女方就是 隔离级别 Propagation.REQUIRED

男方有房子,我就住进去。

反之,男方没有房子,也没关系。

一起奋斗买间房。

总之,房子必须有。

2、 Propagation.SUPPORTS:

如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。

放在上面的例子中,这种女生更难求。

就是说:男方有没有房子都无所谓,就想和他结婚。

至于房子如果有,我就住。

没有,租房也行。

3、Propagation.MANDATORY:

(mandatory:强制性)如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。

这种情况,就非常的现实。

如果男方没有房,就不结婚,甚至直接分手。

反之,女方就直接住进去。【加名,迟早会提出来的。】

总之,房子必须有,男方全款买。

4. Propagation.REQUIRES_NEW:

表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。

也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

这种情况,女生非常作!

男生已经买了房,只不过可能有个 一两年的历史

女方表示必须是新房,旧房我不住!

不是新房,我不接了!!!

5. Propagation.NOT_SUPPORTED:

以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。

这种情况,女方比较奇葩。

就算男方有房子,也不住。

我就是要住 租的房子!

6. Propagation.NEVER:

以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。

这种就更奇葩。

男方有房子,这婚我不接了!分手!

男方没有房子,真好!我要和你结婚。

7. Propagation.NESTED:

如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;

如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED(创建一个新事物)。

这种就是 白富美剧情。

男方有房,女方家里又给了一套房。

如果男方没有房,女方家里表示我可以送一套!


b8bd81e2852f4ad681baa39fdd49248e.png

REQUIRED需要有(事务的默认传播机制)和NESTED嵌套事务的区别:

1) REQUIRED需要有他是如果当前方法存在事务,把当前方法的事务加入到之前的那个事务当中,一荣俱荣,一损俱损(两个事务直接是一个整体,如果其中有任何一个事务有问题,这两个事务作为一个整体都不会执行)——》所有是事务都加到了一个大的事务里面了。


2) NESTED嵌套事务则不同,事务直接不是一个整体,是相互嵌套着的。如果当前存在事务,把当前事务嵌套到之前的事务中来这些,如果当前事务存在异常(只是影响发生异常的这一个事务,不影响其他事务)


3、事务的隔离级别和事务的传播机制的区别

事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的),⽽事务传播机制是保证⼀个事务在多个调⽤⽅法间的可控性的(稳定性的)

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题


5c1daffb26ce443880dc08cd62ce3cfd.png


事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题(或多个事务的嵌套和互相加入)

63edf807ae2343c2aa6be3adef3c1ac5.png

如果是多个事务,在相互调用的情况,也很好理解!

事务的传播机制,在多个事务相互调用的时候,对其进行“行为控制”,让其结果能够达到我们预期的效果。


b5e91c9f8941441e8ed0107e1af80912.png


我们还可以发现,在事务的传播机制中,多个事务都在 “一条线上”。


那么,问题来了:

正如我们前面所说: 如果这三个事务中,有一个事务 只是一个普通方法,不具备事务。使其 事务的传递 中断,我们该怎么做?


是全部回滚,将数据恢复到未操作状态。

还是说,那个事务出现了问题,就回滚那个事务。

或者,不回滚。

这些都是不确定的因数!

这些都是:婆说婆有理,公说公有理。

无论你怎么说,你都有你的道理。


但是!不管怎么说,我们都需要一个统一行为,或者说 一个统一的管理模式。【放在上面例子中,就是要有一个 客观的标准】

这就必须要依靠事务传播机制,依靠 设置 和 规定,来去处理理


参考文章:


SpringBoot 使用 @Transactional 注解配置事务_深寒色的猫丶的博客-CSDN博客


JavaEE进阶 - Spring事务和事务传播机制 - 细节狂魔_java事务传播机制_Dark And Grey的博客-CSDN博客


相关文章
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
2月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
114 4
Spring事务传播机制(最全示例)
|
30天前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
26 2
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
2月前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
22 4
|
1月前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
41 0
|
3月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
3月前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。