什么是事务管理?


  • 第一个问题:什么是事务?
    事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 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 - 事务管理概述的更多相关文章

  1. 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)

    Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...

  2. Spring事务管理概述

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/transaction-management.html: 数据库事务是一个被视为单一的工作单元的操作 ...

  3. Spring 事务管理高级应用难点剖析--转

    第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...

  4. 【转】Spring事务管理

    原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...

  5. spring事务管理——编程式事务、声明式事务

    本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...

  6. Spring 事务管理高级应用难点剖析: 第 3 部分

    本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 ...

  7. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  8. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  9. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

随机推荐

  1. 【布局】圣杯布局&双飞翼布局

    背景 随着前端技术的发展推进,web端的布局方式已基本成熟,那么在网站布局方式中,三列布局最为常用,布局方式也有很多,渐渐的开发者们开始从效率的角度优化自己的代码"如果三排布局能将中间的模块 ...

  2. 关于在elasticSearch中使用聚合查询后只显示10个bucket的问题

    先看下面es查询语句 { "size": 0, "aggs" : { "all_articleId" : { "terms&quo ...

  3. django 从零开始 11 根据时间戳加密数据

    django自带一个加密的方法signer,对数据进行一个加密 一般这种方式用于账号密码邮箱找回,或者token设置 class TimestampSigner(Signer): def timest ...

  4. 使用 notepad 正则转换 字符串

    一..在一堆字符串中找出某一个特定格式的字符串,例如如下 需要摘出 WMID_abc WMID_def WMID_ghi {"abc",WMID_abc,oid_abc} {&qu ...

  5. TCP断开连接(四次挥手)

    四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...

  6. mysql5.7 ERROR 1045 (28000): Access denied for user解决方法

    https://blog.csdn.net/csy2961903/article/details/51345401  参考此文注意指名数据库mysql.user

  7. 【TIJ4】第四章全部习题

    第四章 没啥好说的...... 4.1 package ex0401; //[4.1]写一个程序打印从1到100的值 public class PrintOneToHundred { public s ...

  8. 安卓App自动化测试环境

    一.appium安装 1.nodejs依赖 2..net framework 3.Appium桌面程序安装 3.1.安装包获取 3.2.安装过程 二.Java_ jdk安装 1.Java_jdk版本说 ...

  9. BFPRT算法(求第K小的数字)

    BFPRT算法: 1.介绍: BFPRT算法又叫中位数的中位数算法,主要用于在无序数组中寻找第K大或第K小的数,它的最坏时间复杂度为O(n),它是由Blum,Floyd,Pratt,Rivest,Ta ...

  10. NFS作为根文件系统,挂载超时

    NFS服务器配置正确后,使用ramfs,通过mount能够正常挂载NFS,但是作为ROOTFS无法正常挂载,显示超时. 经查看log,RPC报错-120. 分析结果: 在Ubuntu1804上,nfs ...