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 ...
随机推荐
- Angular 学习笔记(四)
作用域和控制器的交互情况: 1.控制器通过作用域对模板暴露一些方法供其调用 2.控制器中定义的一些方法可改变注册在作用域下的数据模型 3.控制器在某些场合可能需设置监听器来监听作用域中的数据模型:这些 ...
- IAR调试查看程序时间
在无仿真器情况下设置: 调试仿真,点击view菜单下registers 软件仿真时计算两断点CYCLECOUNTER(在CPU registers中)的差值,乘以指令周期(MCLK)便是执行时间
- c# 第24节 分部方法
本节内容: 1:分部方法 1:分部方法 2:实现分部方法 实现:
- 分析-flag被盗
用wireshark打开数据包 寻找http协议的数据 找一个post包进行TCP追踪流 寻找flag
- Selenium WebDriver 中鼠标事件(全)
Selenium WebDriver 中鼠标事件(全) 鼠标点击操作 鼠标点击事件有以下几种类型: 清单 1. 鼠标左键点击 Actions action = new Actions(driv ...
- luoguP2824 [HEOI2016/TJOI2016]排序(线段树分裂做法)
题意 所谓线段树分裂其实是本题的在线做法. 考虑如果我们有一个已经排好序的区间的权值线段树,那么就可以通过线段树上二分的方法得到第\(k\)个数是谁. 于是用set维护每个升序/降序区间的左右端点以及 ...
- php 学习笔记之关于时区的那点事
科普一下什么是时区 众所周知,地球绕着太阳转的同时也会自转,因此同一时刻不同地区所接收到太阳照射的情况不同,所以有的地区是日出,有的地区是日落,还有的地区可能是黑夜. 既然地球上的不同地区时间不同,那 ...
- Django signal(信号)
Django中提供了"信号调度",用于在框架执行操作时解耦,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Django 内置信号 Model signals pr ...
- Vue v-if,v-else-if,v-else的使用
v-else-if 要紧跟 v-if v-else要紧跟v-else-if 或 v-if 代码: <!doctype html> <html lang="en"& ...
- 执行shell脚本遇到错误syntax error: unexpected "then" (expecting "}")
今天执行脚本的时候遇到错误,如下图: root@ApFree:/usr/sbin# ./conntrack_num_graph.sh ./conntrack_num_graph.sh: line : ...