一、什么是事务?

一个事务一旦其中有一个操作出现错误,事物的操作将全部回滚。系统将事务中对数据库的所有的已完成的操作全部撤消,回滚到事务开始的状态。

一个事务中的所有操作作为一个单元,要么完全地执行,要么完全地不执行。

事务是为了确保数据的完整性和一致性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务,声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。

声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。

我们常用基于 @Transactional 注解的方式管理事务。

事务ACID四种特性

ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

(1)原子性(Atomicity)

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

(2)一致性(Consistency)

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

(3)隔离性(Isolation)

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

(4)持久性(Durability)

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


二、Spring Boot @Transactional注解事务回滚不起作用

参考 Spring Boot @Transactional注解事务不回滚不起作用无效

首先要看数据库本身对应的库、表所设置的是什么引擎。MyIsam不支持事务,如果需要支持事务,必须改为InnnoDB

MySQL两种存储引擎: MyISAM和InnoDB

数据库中的存储引擎其实是对使用了该引擎的表进行某种设置,数据库中的表设定了什么存储引擎,那么该表在数据存储方式、数据更新方式、数据查询性能以及是否支持索引等方面就会有不同的“效果”。


三、事务处理 @Transactional注解的使用

  • Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是不能继承的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。
  • @Transactional 注解应该只被应用到 public 修饰的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
  • Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚(Spring事务管理只对出现运行期异常进行回滚)。checked异常,即Exception可try{}捕获的不会回滚,因此对于我们自定义异常,通过rollbackFor进行设定。
  • 如果我们需要捕获异常后,同时进行回滚,通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚操作。
  • 使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。

四、注解@Transactional常用配置

参 数 名 称 功 能 描 述
readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor     rollbackFor    该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时

事物超时设置: @Transactional(timeout=30) //默认是30秒


五、Propagation的属性(事务的传播行为

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

Propagation属性

含义

REQUIRED

默认值 在有transaction状态下执行;如当前没有transaction,则创建新的transaction;

SUPPORTS

如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;

MANDATORY

必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;

REQUIRES_NEW

创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;

NOT_SUPPORTED

在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;

NEVER

在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException。

六、事务5种隔离级别

例如:@Transactional(isolation = Isolation.READ_COMMITTED)

隔离级别 含义
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应;
READ_UNCOMMITTED 最低的隔离级别。事实上我们不应该称其为隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改。可能导致脏,幻,不可重复读
READ_COMMITTED 大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入或更新的数据。这意味着在事务的不同点上,如果其他事务修改了数据,你就会看到不同的数据。可防止脏读,但幻读和不可重复读仍可以发生。
REPEATABLE_READ 比ISOLATION_READ_COMMITTED更严格,该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数据集,即使其他事务修改了所查询的数据。然而如果其他事务插入了新数据,你就可以查询到该新插入的数据。可防止脏读,不可重复读,但幻读仍可能发生。
SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。代价最大、可靠性最高的隔离级别,所有的事务都是按顺序一个接一个地执行。避免所有不安全读取。

脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同。后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。
幻读 : 一个事务读到另一个事务已提交的insert数据

参考 MySQL事务 transaction


参考:

Spring Boot 中使用 @Transactional 注解配置事务管理

SpringBoot事务注解@Transactional

spring事物的七种事物传播属性行为及五种隔离级别

事物注解方式: @Transactional

Spring事务管理只对出现运行期异常进行回滚

SpringBoot 中的事务处理 @Transactional相关推荐

  1. 15.在springboot中的事务处理

    Spring Boot 使用事务非常简单,底层依然采用的是 Spring 本身提供的事务管理 ➢ 在入口类中使用注解 @EnableTransactionManagement 开启事务支持 ➢ 在访问 ...

  2. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  3. springboot中使用@Transactional注解事物不生效的原因

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  4. springboot中得注解_Spring以及SpringBoot中的常用的注解小结

    一.注解的基本概念 Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获 ...

  5. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

  6. springboot中缓存技术的使用、原理及其运行流程

    Springboot中缓存的工作原理 要想在springboot中使用缓存,首先要了解springboot中缓存的工作原理. 我们知道springboot在启动时会有很多的自动配置类(xxx-Auto ...

  7. Shiro的在Springboot中的使用

    一.Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应 ...

  8. (附源码)springboot中北创新创业官网 毕业设计 271443

    Springboot中北创新创业官网 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.本文主要通过对中北创新 ...

  9. SpringBoot 中的验证码、二维码、缩略图、图片上传、定时器调度

    1.验证码生成 pom.xml 文件中添加依赖: <dependency><groupId>com.github.penggle</groupId><arti ...

最新文章

  1. 中国高校4篇研究今日同时登上Nature!清华北大上交浙工大等在列
  2. c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)
  3. 皮一皮:这才是书法的最高境界...
  4. 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
  5. 互动整合营销_初识网络整合营销
  6. python通过链接下载文件-如何使用Python通过HTTP下载文件?
  7. CF1142C U2(计算几何,凸包)
  8. [攻防世界][CTF][2020][MISC] 攻防世界 MISC writeup
  9. python自动生成表格_Python自动整理 Excel 表格
  10. 浏览器存储,储存,Cookie,WebStorage,IndexedDB
  11. 我爱计算机视觉干货集锦分类汇总(2019年3月9日)
  12. ubuntu安装mysql报错_解决Ubuntu 12.04中更改MySQL默认编码报错
  13. Spring 整合 Disruptor 第一个版本
  14. hisi mmz模块驱动讲解
  15. VS2017 Git操作教程
  16. 电容或电感的电压_如何通俗的理解电流,电压,电阻,电容和电感?
  17. [原] Python 根据设备编号获取设备名称
  18. html页面,文字的自动换行
  19. Networkx使用指南
  20. 去重函数-【实践才是检验真理的唯一标准】

热门文章

  1. POJ1821 单调队列//ST表 优化dp
  2. 微信小程序插件内页面跳转和参数传递
  3. 俩层判断,判断button是否可以点击
  4. C++中 #define的用法
  5. js 闭包作用(转自别人的)
  6. 方维订餐系统二次开发,将商户的所有图片调到商铺详情里面
  7. ASP.NET判断当前日期是第几周
  8. 查询HTML标签select中options的值并定位其位置
  9. 世界杯后linux进化有感?
  10. 普林斯顿大学英伟达Facebook提出基于深度神经网络的全动态推理,助力轻量级网络!...