Spring - 事务管理概述
什么是事务管理?
- 第一个问题:什么是事务?事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 SQL 语句,也可以是若干行 JDBC 的 Java 语句。事务既然那么重要,那么它肯定有不一般的原则把?没错,那就是 ACID 原则。
- ACID(Atomicity,Consistency,Isolation,Durability)原则
- A 代表原子性事务中的读和写操作可看作是对数据库的单个原子操作。原子性保证了整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。这就导致了一次操作对某一数据的修改在事务失败后一定会恢复原来的数据。
- C 代表一致性一致性保证了事务前后数据的完整性必须保持一致。也就是要符合我们在原子操作中进行的逻辑运算。例如,完整性约束了 a + b = 10,一个事务改变了 a,那么 b 也应该随之改变。
- I 代表隔离性事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间是相互隔离的。其实可以看做是事务的独立性,即两个以上的事务不会出现交错执行的情况。
- D 代表持久性持久性保证了某一事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并且不会参与下一次回滚,不会随外界原因而导致数据丢失。我觉得这也是旧数据(那些我们只是查看但未曾操作过的)的特性。
- 总的来说,原子性保证了一个事务的进行是不可分割的;一致性保证了事务一定是正确的;隔离性保证了事务管理是可以对事务进行并发控制的;持久性保证了事务完成后,新数据跟旧数据是可以“一视同仁”的。
- 第二个问题:什么是事务管理?假设事务是相对于数据库而言,那么事务管理就是对于一系列数据库操作进行管理。其实事务管理很普遍,就比如说你跟别人转账,突然断网了,这个时候转账就会出错。在没有事务管理的情况下,可能你的钱就会不翼而飞了,而且别人也没有收到。
- 第三个问题:什么是 Spring 的事务管理?在实际开发中,操作数据库时都会涉及到事务管理问题,为此 Spring 提供了专门用于事务处理的 API。Spring 的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。
须知
- 由于声明式事务管理涉及到面向切面编程,所以需要事先导入如下 Jar 包:
- aopalliance-1.0.jar
- aspectjweaver-1.8.0.jar
- spring-aop-4.3.6.RELEASE.jar
事务管理的三个核心接口
- 核心接口所在的包
- 在 Spring 的所有JAR包中,包含一个名为 spring-tx-4.3.6 RELEASE 的 JAR 包该包就是 Spring 提供的用于事务管理的依赖包。
- 在该 JAR 包的 org.springframework transaction 包中,有 3 个接口文件,它们分别是 Spring 事务管理的三个核心接口。
- 第一个接口:PlatformTransactionManager
- Spring 提供的平台事务管理器,主要用于管理事务,下面是其主要的三个方法:
- 用于获取事务状态信息:TransactionStatus getTransaction( TransactionDefinition definition )
- 用于提交事务(我们见的最多的):void commit( TransactionStatus status )
- 用于回滚事务:void rollback( TransactionStatus status )
- PlatformTransactionManage 的实现类
- PlatformTransactionManager 接囗只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。该接口常见的几个实现类如下:
当底层采用不同的持久层技术时,系统只需使用不同的 PlatformTransactionManager 实现类即可。- 第二个接口:TransactionDefinition
- TransactionDefinition 接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法,具体如下:
- 获取事务对象名称:String getName( );
- 获取事务的隔离级别:int getIsolationLevel( );
- 获取事务的传播行为:int getPropagationBehavior( );
- 获取事务的超时时间:int getTimeout( );
- 获取事务是否只读:boolean isReadOnly( );
- 第三个接口:TransactionStatus
- TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息,该接口中包含 6 个方法,具体如下:
- 刷新事务:void flush( );
- 获取是否存在保存点:boolean hasSavepoint( );
- 获取事务是否完成:boolean isCompletede( );
- 获取是否为新事务:boolean isNewTransaction( );
- 获取事务是否回滚:boolean isRollbackOnly( );
- 设置事务回滚:void setRollbackOnly( );
- 示意图
事务的传播行为
- 上述方法中,事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。传播行为有很多种,具体如下表所示:
- 在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务。通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理。而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring 默认传播行为是 REQUIRED。
事务管理的方式(两种)
- 编程式事务管理通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。
- 声明式事务管理通过 AOP 技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过 AOP 技术将事务管理的“切面”植入到业务目标类中。
- 推荐使用声明式事务管理声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率,所以在实际开发中,通常都推荐使用声明式事务管理。
基于 XML 方式的声明式事务
- 基于 XML 方式的声明式事务是在配置文件中通过 <tx: advice> 元素配置事务规则来实现的。当配置了事务的增强处理后,就可以通过编写的 AOP 配置,让 Spring 自动对目标生成代理。<x: advice>元素及其子元素如下图所示:
- 配置 <tx: advice> 元素的重点是配置 <tx: method> 子元素,上图中使用灰色标注的几个属性是 <tx: method> 元素中的常用属性。其属性描述具体如下
基于 Annotation 方式的声明式事务
- 大致需要两步
- 在 Spring 容器中注册事务注解驱动:
- <tx: annotation-driven transaction-manager="transaction Manager"/>
- 在需要事务管理的类或方法上使用 @Transactional 注解
- 如果将注解添加在 Bean 类上,则表示事务的设置对整个 Bean 类的所有方法都起作用;
- 如果将注解添加在 Bean 类中的某个方法上,则表示事务的设置只对该方法有效。
- 其中,使用 @Transactional 注解时,可以通过参数配置事务详情:
Spring - 事务管理概述的更多相关文章
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- Spring事务管理概述
以下内容引用自http://wiki.jikexueyuan.com/project/spring/transaction-management.html: 数据库事务是一个被视为单一的工作单元的操作 ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- 【转】Spring事务管理
原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...
- spring事务管理——编程式事务、声明式事务
本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...
- Spring 事务管理高级应用难点剖析: 第 3 部分
本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 ...
- Spring5.0源码学习系列之事务管理概述
Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
随机推荐
- VUE深入浅出(学习过程)
VUE 2020年02月26日06:27:10 复习过Java8新特性之后开始学习VUE. 了解node了之后,来了解一下VUE.针对于学习VUE用什么开发工具这个问题上,我这里有vsCode和web ...
- 小白学 Python 数据分析(10):Pandas (九)数据运算
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- Nuxt 项目性能优化调研
性能优化,这是面试中经常会聊到的话题.我觉得性能优化应该因具体场景而异,因不同项目而异,不同的手段不同的方案并不一定适合所有项目,当然这其中不乏一些普适的方案,比如耳熟能详的文件压缩,文件缓存,CDN ...
- 统计 Django 项目的测试覆盖率
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试.现在 ...
- Zabbix自动发现并监控磁盘IO、报警
本文转载自: https://www.93bok.com 引言 Zabbix并没有提供模板来监控磁盘的IO性能,所以我们需要自己来创建一个,由于一台服务器中磁盘众多,如果只有一两台可以手动添加,但服务 ...
- angularV4+学习笔记
angular学习笔记之组件篇 1注解 1.1组件注解 @Component注解,对组件进行配置. 1.1.1注解@Component的元数据 selector template/templateUr ...
- BTrace实战
BTrace在解决现场问题的时候非常有用. 1.概述 1.1下载 https://github.com/btraceio/btrace,最新版本是1.3.9 目前1.3.x系列最低支持JDK1.7,要 ...
- H5开发移动应用APP(店铺系列一)
首先,这是个真实的案例,我大兄弟在深圳开汽修店铺,但需要系统来管理日常经营活动,这正不是我擅长的吗? 说干就干,直接后端+web端+移动端来一套,于是紧急赶工,起早摸黑,产出约3万行总量代码,此系统与 ...
- Lambda 方法引用
1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ① 对象 :: 实例方法 ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)