Spring声明式事务的使用:由@Transactional进行标注,可以使用在类和方法上。当标注在类上,类下面所有公共非静态的方法都将启用事务功能。接下来,运行事务注解标注的方法,Spring的事务拦截器就会同时使用事务管理的方法开启事务,然后将代码织入Spring数据库事务的流程中,如果发生异常,就会回滚,如果不发生异常,那么就会提交事务。

spring事务流程图(自己瞎画的):

.@Transactional源码分析:
timeout是事务可以存在的时间戳.(单位为秒)
Value和transactionManager属性是配置的一个Spring事务管理器.
readOnly属性定义事务是否只读.
rollbackFor,rollbackForClassName,noRollbackFor和noRollbackForClassName都是指定异常.发生什么异常回滚事务.
propagation传播行为.
isolation隔离级别
.隔离级别:
关于隔离级别,先说一下数据库事务的4个基本特征,也就是ACID,也算是老话长谈了,
原子性:(事务的操作是一个整体,要么全部成功,要么全部失败,不会出现部分成功,部分失败.),
一致性:(事务在完成的时候,必须所有的数据都保持一致的状态.),
隔离性:(不同事务操作的数据,互相不影响),
持久性:(事务执行过后,数据会存储到数据库中)
隔离级别解决的事情,举个例子说明:
2.1.一个商品初始化为2,事务一扣减库存1,库存为1,事务2扣减库存,读取到事务1为提交的库存数据,扣减库存1,提交事务,库存保存为0,事务一回滚事务,库存结果为0,结果错误.
未提交读(read uncommitted)最低的隔离级别,允许一个事务度去另一个事务没有提交的数据. 2.2.读写提交(read committed)隔离级别,是指定一个事务只能读取另外一个事务已经提交的数据,不能读取未提交的数据.有效的解决了2..脏读的问题.
但是仍旧会出现下列问题:
不可重读场景:商品库存初始化为1,事务一读取库存1,扣减库存,未提交,事务2读取库存1,认为可以扣减,此时事务一提交,库存变为0,事务2扣减库存失败,库存为0,无法扣减.
可重复读:就是克服读写提交中出现的不可重复读的情况,因为在读写提交的时候,确实会出现一些值的变化.
简单点说,就是库存已经被事务一先读取,所以这个时候数据库就阻塞它的读取,直到事务一提交,事务2才能读取库存的值.
幻读:举个例子,事务一读取库存50件货,商品库存初始化为100,现在已经销售了50,剩余50,事务2读取交易记录50,事务一扣减库存,插入交易记录,提交事务,库存49件,交易记录51笔,事务2打印交易记录51笔,这里与查询不一致,在事务2看来有1笔是虚幻的,与之前查询不一致.
2.3.串行化(serializable),数据库隔离最高级别,所有sql按顺序执行.
提示:可以在代码中配置隔离级别.
# - 数据库默认隔离级别,
# 未提交读
# 读写提交
# 可重复读
# 串行化
# tomcat 数据源默认隔离级别:
Spring.datasource.tomcat.default-transaction-isolation=
#dbcp2数据库连接池默认隔离级别
Spring.datasource.dbcp2.default-transaction-isolation=
.传播行为:
在Spring中当一个方法调用另外一个方法时,可以让事务采取不同的策略工作。
3.1.传播行为的定义: REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED):需要事务,它是默认的传播行为,如果当前存在事务,就用当前的事务,否则新建一个事务运行子方法.
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS):支持事务,如果当前存在事务,就用当前事务,如果不存在,就继续采用无事务的方式运行子方法.
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY):必须使用事务,如果当前没有事务,就会抛出异常,如果存在当前事务,那么就使用当前事务.
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW):无论当前事务是否存在,都会创建新的事务执行方法,这样新的事务就可以拥有新的锁和隔离级别的特性,与当前事务互相独立.
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)不支持事务,当前存在事务,将挂起事务,运行方法.
NEVER(TransactionDefinition.PROPAGATION_NEVER)不支持事务,如果当前方法有事务,就抛出异常,否则继续使用无事务机制运行.
NESTED(TransactionDefinition.PROPAGATION_NESTED)在当前方法调用子方法时候,如果子方法发生异常,只回滚子方法执行过的sql,而不会滚当前方法的事务. 3.2.@Transactional自调用失效的问题:
类自身的调用是不会产生AOP的,解决方法可以使用一个Service去调用另一个Service,这样就是代理对象的调用,Spring才会将你的代码,放入AOP.

(入门SpringBoot)SpringBoot项目事务(三)的更多相关文章

  1. Kotlin开发springboot项目(三)

    Kotlin开发springboot项目(三) 在线工具 https://www.sojson.com IDEA中Kotlin生成可执行文件1,项目使用Gradle构建2,在model的build.g ...

  2. Github 上 10 个值得学习的 Springboot 开源项目

    Spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化.编码更简化.部署更方便.近两年受到很多开发者的追捧,也是火热的不行! 下面给大家整理了 10 个 Git ...

  3. springboot+mybatis 使用事务

    一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优点是: 1)非侵入式,业务逻辑不受事务管理代码的污染. 2)方 ...

  4. IDEA+Maven+多个Module模块(创建多模块SpringBoot整合项目)

    最近在学习springboot,先从创建项目开始,一般项目都是一个项目下会有多个模块,这里先创建一个最简单的实例,一个项目下有一个springboot模块项目提供web服务,引用另一个java项目(相 ...

  5. 如何在spring-boot web项目中启用swagger

    swagger的三个项目及其作用 我们打开swagger的官网,会发现有三个swagger相关的项目,它们分别是 swagger-editor 作用是通过写代码,生成文档描述(一个json文件或其他格 ...

  6. SpringBoot Docker入门,SpringBoot Docker安装

    SpringBoot Docker入门,SpringBoot Docker安装 ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...

  7. vscode 新建 springboot java项目

    vscode 新建 springboot java项目 1. 安装javaJDK 软件下载 下载地址: https://www.oracle.com/technetwork/java/javase/d ...

  8. springboot web项目创建及自动配置分析(thymeleaf+flyway)

    @ 目录 源码分析 webjars thymeleaf thymeleaf语法 springmvc 启动配置原理 集成flyway插件 springboot 创建web项目只需要引入对应的web-st ...

  9. 手把手教你从零开始搭建SpringBoot后端项目框架

    原料 新鲜的IntelliJ IDEA.一双手.以及电脑一台. 搭建框架 新建项目 打开IDE,点击File -> New Project.在左侧的列表中的选择Maven项目,点击Next. 填 ...

随机推荐

  1. OpenCV:图像的按位运算

    首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...

  2. 18-搭建本地 Registry

    Docker Hub 虽然非常方便,但还是有些限制,比如: 需要 internet 连接,而且下载和上传速度慢. 上传到 Docker Hub 的镜像任何人都能够访问,虽然可以用私有 reposito ...

  3. STL 中 list 的使用

    list 容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是极快速的.由于list对象的节点并不要求在一段连续的内存中, ...

  4. 第04组 Beta冲刺(4/5)

    队名:new game 组长博客 作业博客 组员情况 鲍子涵(队长) 过去两天完成了哪些任务 地图移动 接下来的计划 素材和脚本相连 引入声音素材 还剩下哪些任务 让游戏本体运行 遇到了哪些困难 时间 ...

  5. ReactNative: ReactNative初始项目的结构

    一.介绍 初学RN,一切皆新.在上篇中成功地创建并运行了一个React-Native项目,这个demo的基本结构都是系统已经创建好的,开发者在此结构下完成自己的开发即可.分别用Xcode和WebSto ...

  6. 《细说PHP》 第四版 样章 第二章 PHP的应用与发展 3

    2.3  PHP的开发优势 每种编程语言都有针对的领域,当然相同领域也有多个编程语言可以选择, 所以需要了解每种编程语言的优势和劣势,才能更好地去选择使用,在对的开发领域充分发挥它的优势,编写出最优质 ...

  7. 依赖注入在 dotnet core 中实现与使用:3 使用 Lazy<T> 延迟实例化

    有些对象我们并不想一开始就实例化,由于性能或者功能的考虑,希望等到使用的时候再实例化.考虑存在一个类 A, 它使用了依赖的类 B,在 A 中,只有某些不常用到的方法会涉及调用 B 中的方法,多数情况下 ...

  8. ACR122U读卡器在win7以上系统使用过程中的设置项

    发现ACR122U这个读卡器在进行nested破解的时候总是卡死,换了N个驱动程序都不行. 后发现是windows系统因智能卡的即插即用设置导致的问题,可以通过组策略的设置搞定. gpedit.msc ...

  9. Java8新特性——集合底层源码实现的改变

    ArrayList 源码分析: jdk7: ArrayList list = new ArrayList();//初始化一个长度为10的Object[] elementData sysout(list ...

  10. Git分布式版本控制器使用

    前言: 使用Git版本控制器差不多有一年多的时间了,在这一年多的时间里对这个传说的的分布式版本控制工具有了一定的了解.在实战项目开发中,对关于如何在通过Git提交项目,以及如何使用Git命令对提交的文 ...