1、数据库事务基础概念

  数据库事务是对数据库一次一系列的操作组成的单元,可以包含增删改查或者只有单个操作。数据库事务具有四大特性(ACID),ACID是数据库事务正确执行的四个基本要素的缩写。分别指:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要支持这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。

1.1、 原子性(Atomicity)
  原子性是指一个事务中的操作单元要不全部成功提交要不全部失败回滚。
 

1.2、 一致性(Consistency)
  一致性是指数据库在事务执行前后处于一致的状态,比如说消费和账户余额,消费了100,那么账户余额必然减少了100。在单个事务的运行的情况下通过事务的原子性可以保证事务的一致性,在多事务并行的情况下可通过事务的隔离性保证一致性。一致性还可以细分为强一致性、最终一致性等。
 
1.3、 隔离性(Isolation)
  隔离性是指在多个事务并行的情况下事务相互之间的影响,不同的隔离级别事务之间相互产生的影响不同。sql标准规范定义了四个隔离性级别,分别是脏读、读写提交、可重复度、序列化,这四个级别稍后详细说明。每种数据库默认支持的隔离级别不同,Oracle默认支持读写提交,MySql默认支持可重复读。
 
1.4、 持久性(Durability)
  持久性是指事务一旦提交,对于数据库来讲,这个事务对数据的修改是永久性的,不可改变。
 

2、Spring中注解事务的使用

  @Transactional 注解,一般用于service层,如果需要在ctrl层使用,必须在springmvc的配置文件中配置注解相关的bean。注解可以表示到类上或者public方法上。如果表示到类上那么该类所有的public方法的事务将被spring管理。@Transactional注解有很多属性,不同属性配置不同的值对事务的执行有很大的影响,我们需要掌握不同属性值的含义。

2.1、 propagation 传播性

  Spring 的传播性是指一次请求中多个操作如何用事务管理。是采用同一个事务管理,还是每个操作使用不同的事务管理。这些都是由传播性决定的。
  REQUIRED:这个是默认值,每次调用方法的时候如果已经存在事务则沿用存在的事务否则开启一个新事物。
 
  REQUIRES_NEW:请求到达时,不管是否有事务存在,都会开启一个新的事务。
 
  NESTED:嵌套事务,调用方法如果抛出异常只回滚自己内部的SQL,而不回滚主方法的SQL,如果数据库支持保存点技术(savepoint),则使用保存点否则和REQUIRES_NEW一样。
以上三个传播性是企业比较常用的三种。还有一些用的比较少的如SUPPORTS(如果存在事务则沿用,否则没有事务)、NEVER(不支持事务)、NOT_SUPPORT、MANDATORY(方法必须在事务中运行)。

2.2、 isolation 隔离性

  SQL标准定义了数据库事务隔离性的四个级别,分别是:脏读、读写提交、可重复读(针对的是同一条记录)、序列化。通过数据库的锁保证不同的隔离性下事务的正确执行以达到数据库的一致性。
 
  脏读:在俩个事务并行的情况下,一个事务可以读取另外一个事务未提交的修改。另外一个事务最终可能不提交数据导致出现脏读现象。
 
  读写提交:一个事务可以读取另外一个事务已经提交后的数据。但是这种情况下有不可重复读的问题,比如说:在读取后其他事务可能修改这条数据,导致后续数据修改或者判断异常,这个问题称为不可重复读。
 
  可重复读:这个级别可以解决不可重复读的问题,在这个级别下,同一条数据只能由一个事务操作,即将多个事务序列化了(操作同一条数据的事务)。这个情况下存在的问题是幻读,比如说查询结果有10条数据,但是导出的时候却导出了11条数据,因为在这个期间其他事务写入了数据,但不是同一条数据。
 
  序列化:所有的事务排队执行,效率较差.。
 
2.3、 timeout
  事务超时时间,单位是妙,超时时会抛出异常,导致事务回滚。
 
2.4、 readonly
  是否开启只读事务,开启只读事务数据库会对该次事务操作做一系列优化,不同的数据库优化方式不同。
 
2.5、 rollbackFor
  指定需要回滚的异常,如果不指定异常那么Spring事务只有在遇到运行时异常时才会回滚事务,而在遇到非运行时异常时则不会回滚事务。@Transactional(rollbackFor=Exception.class) 指定Exception,则所有的异常都会导致事务回滚。
 

2.6、 noRollbackFor
  定义异常,当事务中发生所定义的异常时事务不进行回滚,会继续提交事务。
 

3、Spring事务使用注意场景

  • @Transactional 注解 对静态方法和非public方法无效。事务注解对象是依赖Spring AOP 实现的,AOP代理的是对象,必须通过代理对象调用方法,事务才能起作用。而静态方法无法被对象使用,私有方法也无法在对象外使用,所以事务注解对这俩类方法无效。
     
  • 自调用,在同一个类中一个公开方法调用另外一个公开方法,第二个公开方法上标识的@Transaction注解无效。(Spring AOP 动态代理的原因)。可以通过容器获取bean(此时的bean是一个代理bean)然后调用第二个公开方法
     
  • ctrl中调用多个标有@Transactional 注解的service方法时,会开启多个事务而不是同一个事务。
     
  • 切勿长时间占用事务,数据库连接是非常宝贵的资源,长时间占用事务,会导部分数据请求超时。
     
  • spring根据是否抛出异常来决定是否回滚事务,所以如果异常被捕获了的话,spring的事务是不会回滚的。
     

Spring事务部分知识点整理的更多相关文章

  1. Spring 事务相关点整理

    Spring和事务的关系 关系型数据库.某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务. Spring很显然不是事务性资源,但是它可以管理事务性资源,所以Spring和 ...

  2. 2019年Spring核心知识点整理,看看你掌握了多少?

    前言 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪. Spring 概述 Spr ...

  3. Spring MVC知识点整理

    网上Spring MVC相关知识点的介绍已经有很多了,但是大部分文章都是介绍其中的一部分知识点. 本文希望能够向读者做一个基本整体的介绍,首先我们先来了解下Spring MVC的基础接口和组件.   ...

  4. 【面试】Spring事务面试考点吐血整理(建议珍藏)

    Spring和事务的关系 关系型数据库.某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务. Spring很显然不是事务性资源,但是它可以管理事务性资源,所以Spring和 ...

  5. Spring重要知识点整理

    一.IOC(Inversion of Control):控制反转 (1)Spring Core最核心部分 (2)需要先了解依赖注入(Denpendency Injection)/把底层类作为参数传递给 ...

  6. java异常与spring事务关系的知识点查漏补缺

    一.基础概念 java的异常结构图 从图中可知 Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,j ...

  7. Spring 事务管理基础知识点

    参考文章 spring事物配置,声明式事务管理和基于@Transactional注解的使用 尚硅谷 佟刚 Spring视频教程PPT Spring支持编程式事务管理和声明式事务管理两种方式 编程式事务 ...

  8. 一文带你认识Spring事务

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y Spring事务管理我相信大家都用得很多,但可能仅仅 ...

  9. JAVA 150道笔试题知识点整理

    JAVA 笔试题 整理了几天才整理的题目,都是在笔试或者面试碰到的,好好理解消化下,对你会有帮助,祝你找工作顺利,收到满意的 offer . 1.Java 基础知识 1.1 Java SE 语法 &a ...

随机推荐

  1. [视频教程] 使用composer安装使用thinkphp6.0框架

    安装composer -vvv的参数是表示展示安装进度,测试时使用其他参数安装失败,一直卡着不动curl -vvv https://getcomposer.org/installer | phpmv ...

  2. 01-CSS3-justify-content: space-around; justify-content: space-between;

    /* justify-content: space-around; 运用在父级元素上 第一个子元素距离左边的距离==最后一个子元素距离右边的距离 除第一个子元素和最后一个子元素外,第2个,第3个... ...

  3. Django的下载与创建。

    一.下载 (1)下载命令. 在cmd中输入下载命令: pip3 install django==1.11.11 1.11.11是该版本号. (2)pycharm中下载 直接在pycharm中下载set ...

  4. 【转】Restful架构详解

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  5. 剑指Offer-17.树的子结构(C++/Java)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构 ...

  6. Ubuntu16.04 UltraEdit 安装&破解&使用

    (1)下载:登录到官网(http://www.ultraedit.com/downloads/uex.html)选在对应的版本进行下载. (2)安装: (使用命令行方式安装)在本地路径进行安装:sud ...

  7. 机器学习之KNN

    KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是 ...

  8. x3

    #include<stdio.h> int main() { char ch; printf("输入一个字符:\n"); scanf("%c",&a ...

  9. Python源码:字典

    一.创建增加修改 1.实现代码 #创建 stu_info = { "xiedi":28, "liuhailin":27,"daiqiao": ...

  10. JDK的小Bug你了解么?

    ​用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨,依然坚持在一线上,是不是感觉很神奇,但是,有没有多 ...