Spring事务管理:核心接口讲解

简介: Spring事务管理:核心接口讲解

事务:

事务:是逻辑上一组操作,要么全都成功,要么全都失败.

事务特性:ACID

ACID,指数据库事务正确执行的四个基本要素的缩写。

包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

 

  • 原子性(Atomicity):事务不可分割
  • 一致性(Consistency):事务执行的前后,数据完整性保持一致.
  • 隔离性(Isolation):一个事务执行的时候,不应该受到其他事务的打扰
  • 持久性(Durability):一旦结束,数据就永久的保存到数据库.

(1)原子性(Atomicity)

  • 事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

(2)一致性(Consistency)

  • 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。

(3)隔离性(Isolation)

  • 指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

(4)持久性(Durability)

  • 指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。


如果不考虑隔离性:

 

  • 脏读:一个事务读到另一个事务未提交数据
  • 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致
  • 虚读:      一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致


事务的隔离级别:

 

  • 未提交读:以上情况都有可能发生。
  • 已提交读:避免脏读,但不可重复读,虚读是有可能发生(Oracle)。
  • 可重复读:避免脏读,不可重复读,但是虚读有可能发生(MySQL)。
  • 串行的:避免以上所有情况.
  • 默认级别. Mysql  repeatable_read        oracle read_commited


Spring中事务管理:

分层开发:事务处在Service层.


Spring提供事务管理API:

 

PlatformTransactionManager:平台事务管理器.

常用方法:

 

 

 

TransactionDefinition:事务定义

ISOLation_XXX:事务隔离级别.

PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)

过期时间:

 

 

TransactionStatus:事务状态

是否有保存点

是否一个新的事务

事务是否已经提交

 

关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,

管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.


Spring事务管理API详解:

 

PlatformTransactionManager:接口.

Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现


TransactionDefinition:

事务隔离级别(四种)


事务传播行为(七种)

 传播行为:解决业务层之间的调用的事务的关系.

  1. PROPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个
  1. * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)
  1. PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
  1. * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.
  1. PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
  1. * A,B 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.
  1. PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
  1. * A,B 如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)
  1. PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果有事务存在,挂起当前事务
  • * A,B 非事务的方式运行,A有事务,就会挂起当前的事务.
  1. PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  2. PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
  3. * 基于SavePoint技术.

         * A,B A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,

         用户需要自己设置事务提交还是回滚.

 


目录
相关文章
|
23天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
39 1
Spring高手之路24——事务类型及传播行为实战指南
|
17天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
30 3
|
2月前
|
存储 安全 Java
|
3月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
3月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
158 4
Spring事务传播机制(最全示例)
|
2月前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
34 2
|
2月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
3月前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
23 4
|
2月前
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
277 0
|
3月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
387 6