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. c++ 多态的内幕

    c++ 多态,就是利用了一个二级指针(指针数组),数组里的每个元素都指向了,用virtual修饰的成员函数. 既然提到了指针,那就让我们用内存地址来证明一下吧. 为了证明,我们必须要取到成员函数的首地 ...

  2. CodeForces - 1244D (思维+暴力)

    题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...

  3. Ubuntu18.04连接蓝牙耳机

    使用的耳机是索尼WI-SP500,打开设置,找到Bluetooth,直接连接(WI-SP500在连接第二台设备时,需要长按开机键7秒才行), 保证Output选择需要连接的耳机,然后确保Profile ...

  4. 第36课 经典问题(下)----关于string的疑问

    实例1: 下面的代码输出什么,为什么? #include <iostream> #include <string> using namespace std; int main( ...

  5. 字符设备驱动程序之poll机制(韦大仙)

    明确为什么要引用poll机制? while(1) { read(fd,&key_val,1);//如果没有按键按下,它会一直在等待.现在想做这么一件事情:如果5s后,没有按键按下,它就会返回. ...

  6. SpringCloud学习笔记(五、SpringCloud Netflix Hystrix)

    目录: Hystrix简介 线程隔离:线程池.信号量 服务降级.服务熔断.请求缓存.请求合并 Hystrix完整流程.Hystrix属性值 注解方式实现Hystrix Hystrix Dashboar ...

  7. template指针小测试

    测试结论: 1 函数指针 -- 使用形参固定的一系列函数作为某个函数的形参 -- callback机制 2 模板指针 -- 使用形参可变的一系列函数作为某个函数的形参 -- 3 typename -- ...

  8. GitHub官网基本介绍

    1.当我们进入官网后会出现登陆的界面,这里我一一来解释大概的意思根据图中顺序来解释(1)是输入用户.邮箱.密码的地方.(2)是当你注册好了之后或者已注册之后点击这里跳转到登陆的界面.(3)是当你第一次 ...

  9. html各种弹出框和提示框

    控制台输出 console.log() console.info() confirm() alert() promt()   提示对话框

  10. unique_ptr的实现原理

    在C++11中有两个智能指针类型来管理动态对象,share_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指对象. 我们知道指针或引用在离开作用域时是不会进行析构的,但是类在离开作 ...