Spring事务部分知识点整理
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事务部分知识点整理的更多相关文章
- Spring 事务相关点整理
Spring和事务的关系 关系型数据库.某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务. Spring很显然不是事务性资源,但是它可以管理事务性资源,所以Spring和 ...
- 2019年Spring核心知识点整理,看看你掌握了多少?
前言 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪. Spring 概述 Spr ...
- Spring MVC知识点整理
网上Spring MVC相关知识点的介绍已经有很多了,但是大部分文章都是介绍其中的一部分知识点. 本文希望能够向读者做一个基本整体的介绍,首先我们先来了解下Spring MVC的基础接口和组件. ...
- 【面试】Spring事务面试考点吐血整理(建议珍藏)
Spring和事务的关系 关系型数据库.某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务. Spring很显然不是事务性资源,但是它可以管理事务性资源,所以Spring和 ...
- Spring重要知识点整理
一.IOC(Inversion of Control):控制反转 (1)Spring Core最核心部分 (2)需要先了解依赖注入(Denpendency Injection)/把底层类作为参数传递给 ...
- java异常与spring事务关系的知识点查漏补缺
一.基础概念 java的异常结构图 从图中可知 Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,j ...
- Spring 事务管理基础知识点
参考文章 spring事物配置,声明式事务管理和基于@Transactional注解的使用 尚硅谷 佟刚 Spring视频教程PPT Spring支持编程式事务管理和声明式事务管理两种方式 编程式事务 ...
- 一文带你认识Spring事务
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y Spring事务管理我相信大家都用得很多,但可能仅仅 ...
- JAVA 150道笔试题知识点整理
JAVA 笔试题 整理了几天才整理的题目,都是在笔试或者面试碰到的,好好理解消化下,对你会有帮助,祝你找工作顺利,收到满意的 offer . 1.Java 基础知识 1.1 Java SE 语法 &a ...
随机推荐
- Linux 查找目录下大于*M的文件
1. 查找指定文件夹下等于1M的文件 find ./ -size 1M | wc -l 2. 查找指定文件夹下大于1M的文件 find ./target_path -size +1M | wc -l
- postman---postman参数关联
我们做接口测试的时候都会遇到一个场景,就是参数关联,所谓的参数关联就是上一个参数的返回值用于下一个参数的请求中,通过python中requests我们知道如何请求,那么通过postman如何请求? 参 ...
- Ubuntu 18.04安装 pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib
1.目前Python版本管理工具有很多,pyenv是比较好用的一款,安装如下: 输入: git clone https://github.com/pyenv/pyenv.git ~/.pyenv ec ...
- GitHub密钥生成
前提电脑上需装有Git软件 这里提供百度云下载地址:https://pan.baidu.com/s/1r0y4XRyQCz7ZJBnZJhAtqw 提取码:88qf 1.登录GitHub账号 2.点 ...
- vue项目关闭eslint校验
[前言] eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格.这篇文章主要介绍了vue项目关闭eslint校验,需要的朋友可以参考下 [主体] 简介eslint esl ...
- ARM的堆栈方式
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack): 当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack): 根据对战的生成方式分为:递增堆栈(Asce ...
- Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E bfs + 离线处理
https://codeforces.com/contest/1037/problem/E 题意 有n个人,m天,在第i天早上,x和y会成为朋友,每天晚上大家都要上车,假如一个人要上车那么他得有至少k ...
- 洛谷P3723 [AH2017/HNOI2017]礼物
吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...
- Unity编辑器扩展学习 转载
https://www.xuanyusong.com/archives/category/unity/unity3deditor 1 using UnityEngine; public class T ...
- 二分图学习记 之 KM算法 二分图最大权完美匹配。
前置知识 :匈牙利算法 首先有这样一张图,求这张图的最大权完美匹配. 当然如果你不想看这些渣图的话,您可以转到 洛谷 运动员最佳匹配问题 下面我来强行解释一下KM算法 左边一群妹子找汉子,但是每个妹子 ...