Spring——什么是事务?传播行为?事务隔离级别有哪些?

简介: 提交事务(如果核心业务处理过程中没有出现异常)(commit transaction)

思维导图


8e60cd25127d468aa7bd33c6c1df5e35.png


一、什么是事务?


多条DML要么同时成功,要么同时失败


@Transaction(tx)


二、事务的四个过程:


1.开启事务(start transaction)


2.执行核心业务代码


3.提交事务(如果核心业务处理过程中没有出现异常)(commit transaction)


4.回滚事务(如果核心业务处理……出现异常)(rollback transaction)


三、事务的四个特性(ACID)是什么?


  • 原子性:不可分割,事务是最小的工作单元,


  • 一致性:事务前后总量不变,要么成功都成功,要么失败都失败


  • 隔离性:多操作之间不会产生影响就。事务和事务之间因为有隔离性,才可以保证互不干扰


  • 持久性:一个事务一旦被提交,它对数据库的数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其他有任何影响(结束的标志)


四、Spring事务管理


1、事务添加J2EE三层结构里面Service层(业务逻辑层)


2、在Spring进行事务管理操作两种方式:


①、编程式事务管理(自己写流程)


②、声明式事务管理:基于注解方式、基于xml配置文件方式


3、声明式事务管理:


基于注解方式


基于xml配置文件方式


4、在Spring进行声明式事务管理,底层使用AOP原理


5、Spring事务管理API:


PlatformTransactionManager


五、注解是什么?


@Transaction


六、可以用在哪里?


类上:类里的所有方法都添加事务


方法上:只是为方法添加事务


七、创建事务管理器


1.开启事务注解


2.在service类上面(或者service类里面方法上面)添加事务注解:@Transactional,这个注解添加到类上面,也可以添加方法上面


a.如果把这个注解添加类上面,这个类里面所有的方法都添加事务


b.如果把这个注解添加方法上面


八、事务属性


1、传播行为


传播行为是什么?


在service类中有a()方法和b()方法,a()方法上有事务,b()方法上也有事务,当a()方法执行过程中调用b()方法,事务是如何传递的?合并到一个事务里?还是开启一个新的事务?这就是事务传播行为。


①、枚举类型


事务传播行为在spring框架中被定义为枚举类型:


5126aa8994d44e06a0a1d413814c85dc.png


②、传播行为有哪些?


REQUIRED:支持当前事务,如果不存在就新建一个(默认)【没有就新建,有就加入】


SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行


MANDATORY:必须运行在一个事务中,如果当前没有事务正在发生,就抛出一个异常


NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务【不支持事务,存在就挂起


NEVER:以非事务方式运行,如果有事务存在,抛出异常【不支持事务,存在即抛异常】


NESTED:如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中,被嵌套的事务可以独立于外层事务进行提交或回滚,如果外层事务不存在,行为就像REQUIRED一样【没有事务就像和REQUIRED一样】


③、如何使用传播行为?


848dbfbd99c540b5ac128c67610b22f6.png


2、事务隔离级别


①、事务为什么要有隔离?


是为了解决多个并行事务竞争导致的数据安全性问题的一种规范


多个事务竞争可能会出现三种不同的现象:脏读、不可重复读、幻读


②、数据库中读取数据存在的三大问题:(三大读问题)


。脏读:读取到没有提交到的数据库的数据


。不可重复读:同一事务当中,第一次和第二次读取的数据不一样


。幻读:读到的数据是假的


—脏读

读取了还未提交的数据,然后回滚了


脏数据:还没有完全确定下来的数据


9f0fd172d1a0486c9cb2673782457338.png


—不可重复读


指更新操作


对某个数据多次查询,但是返回了不同的结果。因为在查询间隔,被另一个事务修改并提交了


000a05415ff040e085473df1b61738cd.png


例如,一个编辑人员两次读取同一文档(如QQ或钉钉在线文档),但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题


—幻读


指增加、删除操作


读取了提交的新事务


事务A在多次读取数据的时候,另一个事务B对这个数据进行了增加或删除操作,导致事务A多次多次读取的数据不一致。


a2ec89b4759c4848afdd86654d909def.png


不可重复读和幻读的区别?


二者描述的则重点不同,不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加和删除操作。


③、事务隔离级别有哪些?


  • 读未提交:read_uncommitted


。有脏读问题


  • 读提交:read_committed


。解决了脏读问题,其他事务提交之后才能督导,但存在不可重复读问题


  • 可重复读:repeatable_read


。解决不可重复读,可达到重复读效果,只要当前事务不结束,读取到的数据一直都是一样的,存在幻读问题


  • 序列化:serializable


。解决幻读问题,事务排队执行,不支持并发


cf8ee3c8c4e948b88cbebc4d21e1f73d.png


3、只读事务(readOnly)


作用:spring启动优化策略


@Transactional(readOnly=true)


将当前事务设置为只读事务,在该事务执行过程中只允许select语句执行,delete、insert、update都不可执行


作用是:启动spring的优化策略,提高select语句执行效率(如果该事务中确实没有增删改操作,建议设置为只读事务)


(意思是:如果事务只读的话,最好设置为只读的,意思是在告诉spring框架你可以启动自己的优化策略了,来提高select的查询效果)


4、设置哪些异常回滚事务


@Transactional(rollbackFor = RuntimeException.class)


表示当发生RuntimeException异常时就回滚事务


5、设置哪些异常不回滚事务


@Transactional(rollbackFor = NullPointerException.class)


表示当发生NullPointerException异常不回滚,其他都回滚


Spring系列文章:


Spring——是什么?作用?内容?用到的设计模式?


Spring——Bean管理-xml方式进行属性注入


Spring——Bean管理-注解方式进行属性注入


Spring——什么是IOC?


Spring——AOP是什么?如何使用?


Spring——什么是事务?传播行为?事务隔离级别有哪些?


Spring——整合junit4、junit5使用方法


如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏脚印支持一下博主~

相关文章
|
16天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
18天前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
57 4
Spring事务传播机制(最全示例)
|
2天前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
12 2
|
3天前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
14天前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
18 4
|
5天前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
18 0
|
2月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
16天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
3月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。

热门文章

最新文章