(入门SpringBoot)SpringBoot项目事务(三)

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

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

1[email protected]源码分析:
   timeout是事务可以存在的时间戳.(单位为秒)
   Value和transactionManager属性是配置的一个Spring事务管理器.
   readOnly属性定义事务是否只读.
   rollbackFor,rollbackForClassName,noRollbackFor和noRollbackForClassName都是指定异常.发生什么异常回滚事务.
   propagation传播行为.
   isolation隔离级别
2.隔离级别:
   关于隔离级别,先说一下数据库事务的4个基本特征,也就是ACID,也算是老话长谈了,
原子性:(事务的操作是一个整体,要么全部成功,要么全部失败,不会出现部分成功,部分失败.),
一致性:(事务在完成的时候,必须所有的数据都保持一致的状态.),
隔离性:(不同事务操作的数据,互相不影响),
持久性:(事务执行过后,数据会存储到数据库中)
隔离级别解决的事情,举个例子说明:
2.1.一个商品初始化为2,事务一扣减库存1,库存为1,事务2扣减库存,读取到事务1为提交的库存数据,扣减库存1,提交事务,库存保存为0,事务一回滚事务,库存结果为0,结果错误.
未提交读(read uncommitted)最低的隔离级别,允许一个事务度去另一个事务没有提交的数据.

   2.2.读写提交(read committed)隔离级别,是指定一个事务只能读取另外一个事务已经提交的数据,不能读取未提交的数据.有效的解决了2.1.脏读的问题.
      但是仍旧会出现下列问题:
      不可重读场景:商品库存初始化为1,事务一读取库存1,扣减库存,未提交,事务2读取库存1,认为可以扣减,此时事务一提交,库存变为0,事务2扣减库存失败,库存为0,无法扣减.
      可重复读:就是克服读写提交中出现的不可重复读的情况,因为在读写提交的时候,确实会出现一些值的变化.
      简单点说,就是库存已经被事务一先读取,所以这个时候数据库就阻塞它的读取,直到事务一提交,事务2才能读取库存的值.
      幻读:举个例子,事务一读取库存50件货,商品库存初始化为100,现在已经销售了50,剩余50,事务2读取交易记录50,事务一扣减库存,插入交易记录,提交事务,库存49件,交易记录51笔,事务2打印交易记录51笔,这里与查询不一致,在事务2看来有1笔是虚幻的,与之前查询不一致.
2.3.串行化(serializable),数据库隔离最高级别,所有sql按顺序执行.
提示:可以在代码中配置隔离级别.
# -1 数据库默认隔离级别,
#1 未提交读
#2 读写提交
#4 可重复读
#8 串行化
# tomcat 数据源默认隔离级别:
Spring.datasource.tomcat.default-transaction-isolation=2
#dbcp2数据库连接池默认隔离级别
Spring.datasource.dbcp2.default-transaction-isolation=2
3.传播行为:
  在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[email protected]自调用失效的问题:
   类自身的调用是不会产生AOP的,解决方法可以使用一个Service去调用另一个Service,这样就是代理对象的调用,Spring才会将你的代码,放入AOP.

原文地址:https://www.cnblogs.com/historylyt/p/10924977.html

时间: 2024-11-14 11:57:15

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

springboot搭建项目

springboot搭建项目 =================================== pom文件中引入springboot父类依赖,所有springboot项目都必须依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEA

springboot多个事务管理

目录 导入依赖 在application.properties配置文件中对两个数据库的配置内容稍作修改. 在java文件夹下新建dbconfig包 在上篇文章中已经配置了数据源的两个配置类,这里需要修改一下. 启动类加上注解配置 @(springboot多个事务管理) 参考上篇文章配置多数据源 Springboot使用jta管理多个事务. 导入依赖 <!-- jta 管理多个数据源的事务--> <dependency> <groupId>org.springframew

SpringBoot 自动化项目部署

1.查看当前服务器下面该项目是否在运行. ps aux | grep "0.0.1-SNAPSHOT.jar" | grep -v grep | awk '{print $2}' 该命令理解 “ps aux | grep "0.0.1-SNAPSHOT.jar"”,该部分主要查找已经启动的服务中包含“0.0.1-SNAPSHOT.jar”. “grep -v grep”的意思排除grep这条记录,“awk”用来打印该服务的端口. ? ~ ps aux | grep

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

原料 新鲜的IntelliJ IDEA.一双手.以及电脑一台. 搭建框架 新建项目 打开IDE,点击File -> New Project.在左侧的列表中的选择Maven项目,点击Next. 填写GroupId和ArtifactId 什么是GroupId和ArtifactId?大家可以参考一下google出来的定义,可以参考一下. GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称

SpringBoot Mybatis项目中的多数据源支持

1.概述 有时项目里里需要抽取不同系统中的数据源,需要访问不同的数据库,本文介绍在Springboot+Mybatis项目中如何支持多数据源操作. 有需要的同学可以下载 示例代码 2.建数据源 首先,我们建两个测试库 test1 test2,分别建两个表,分别添加一些测试数据 CREATE TABLE `groupidinfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `groupId` varchar(255) DEFAULT NULL, `versio

tky项目第三个半月总结

前两篇文章中,介绍了tky项目的相关情况.第一篇主要介绍项目的总体架构.项目的进展情况.项目的优势与开发中存在的问题:第二篇主要介绍了项目中的一个比较重要的测试中发生的事情:今天来说说,这半个月的经历. 总体来说,项目较成功的通过了评测中心的测试.经理很体谅大家前阶段的辛苦,所以就让大家休息了一个星期.这一星期,大家都到点儿下班,唯一的工作就是对前阶段的工作做一个总结,然后干一些自己想干的事情. 经过一个星期的修整,接下来就又要开始第二轮的战斗了.近期,领导可能会过来看一下我们的系统.所以我们要

React 实践项目 (三)

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行状态管理,这次我们使用Redux-saga 管理 Redux 应用异步操作 React 实践项目 (一)React 实践项目 (二)React 实践项目 (三) - 首先我们来看看登陆的 Reducer export const auth = (state = initialState, actio

《Word 2003从入门到精通》第三部分(高级排版)WORD课件

<Word 2003从入门到精通>第三部分(高级排版) 讲师 朱先忠 Part 0主要内容 Part 1 使用分节符 1.1 节定义 节是Word中一个大型的独立编辑单位,每一节都可以设置成不同的格式.通过插入分节符可以将文档分成许多节,然后根据需要设置每一节的不同格式.打个比方,分节符就像一道篱笆,将栏格式设置围起来.灵活使用分节符可以达到最大限度地美化界面,但是此概念的使用有许多细节需要注意,想灵活使用有一定难度. [提示]默认情况下,整个文档即是一节.节在许多界面中普通存在,但许多初级用

tomcat发布web项目的三种方式

tomcat发布web项目的三种方式 方式一: 配置tomcat 安装目录下的conf/server.xml <Host name="loaclhost">标签里面添加 <Context path="/aa" docBase="C:\AA\BB" /> 即/aa这个虚拟路径映射到了C:\AA\BB目录下,修改完servler.xml需要重启tomcat服务器 方式二: 在conf目录下创建Catalina目录,在此目录下新