Spring事务及事务传播机制

目录

一、什么是事务

二、事务的操作

三、Spring下实现事务

1、Spring编程式事务

(1)事务提交

(2)事务回滚

2、Spring声明式事务

(1)无异常--提交

(2)异常且不捕获--回滚

(3)异常且捕获--提交

四、异常捕获后进行回滚

1、再次抛异常--回滚

2、手动进行回滚--回滚

五、@Transactional注解常见三个属性

1、rollbackFor

2、Isolation

3、propagation

一、什么是事务

事务是一个不可分割的操作。事务会把一些列操作看做一个整体提交给数据库,要么全部执行成功,要么出现异常全部撤回不执行。例如:A向B转100元,此时A账号-100,B账号+100,修改数据库时,对这两个操作就要求要求全部成功或全部失败。

二、事务的操作

开启事务、提交事务(全部成功)、回滚事务(全部失败)。

三、Spring下实现事务

用户表注册账号,使用事务实现。准备工作:用户表、实体类、建立数据库连接。

1、Spring编程式事务
(1)事务提交

DataSourceTransactionManager:事务管理器,用来获取事务(getTransaction)、提交事务(commit)、回滚事务(rollback);

TransactionDefinition:是事务的属性,在获取事务的时候,需作为参数,从而获取到一个事务;

TransactionStatus:事务的状态,提交和回滚。

当事务是提交时,数据库插入成功。

(2)事务回滚

事务进行了回滚,虽然提醒插入成功,但数据库没有插入的结果。

2、Spring声明式事务

以上需要获取事务、提交事务、回滚事务,比较繁琐。当加上@Transactional注解之后,就自动获取事务,没有异常或异常已进行捕获自动提交事务,有异常且未进行捕获就回滚事务。

(1)无异常--提交

(2)异常且不捕获--回滚

事务进行了回滚,虽然提醒插入成功,但数据库没有插入的结果。

(3)异常且捕获--提交

四、异常捕获后进行回滚

上述出现异常后,如若进行了捕获,事务还是会提交。如何在异常捕获后进行事务回滚???

1、再次抛异常--回滚

2、手动进行回滚--回滚

五、@Transactional注解常见三个属性

1、rollbackFor

rollbackFor:异常回滚属性,指定能够触发事务回滚的异常类型,可以指定多个异常类型。

@Transactional注解默认只有运行时异常和Error时才会进行回滚,其他异常不会回滚。

例如:

以上代码在运行时会抛出IOException异常,但事务依旧会提交,因为不是运行时异常。

若想所有异常都进行回滚,可以设置rollbackFor属性:

2、Isolation

Isolation:事务隔离级别。

(1)之前学习mysql的隔离级别:

①读未提交(可能出现脏读);②读提交(不可重复读);③可重复读(可能出现幻读)--mysql默认隔离级别;④串行化读。

(2)@Transactional注解的隔离级别:

①Isolation.DEFAULT:以连接的数据库的事务隔离级别为主;

②Isolation.READ_UNCOMMITTED:读未提交,可能出现脏读;

③Isolation.READ_COMMITTED:读已提交,不可重复读;

④Isolation.REPEATABLE_READ:可重复读,可能出现幻读;

⑤Isolation.SERIALIZABLE:串行化读。

(3)设置@Transactional注解的Isolation属性

3、propagation

propagation:事务的传播机制。

多个事务之间存在调用关系,事务如何进行传播的???

(1)Spring事务传播机制有7种:

Propagation.REQUTRED:默认的事务传播机制,如果当前外部方法存在该事务,则内部方法加入该事务,如果当前外部方法没有事务,则内部方法创建一个新的事务。

例如:A方法中调用了B,若A方法有事务,则B不创建事务;若A方法没有事务,则B创建事务。若B中的某一个方法出现异常,则B的所有事务都回滚。

Propagation.SUPPORTS:如果当前外部方法存在事务,则内部方法加入该事务;如果当前外部方法没有事务,则内部方法以非事务的方式继续运行。

例如:A方法中调用了B,若A方法有事务,则B不创建事务;若A方法没有事务,则B以非事务方式运行。若A存在事务且B中的一个方法出现异常,则B的所有事务都回滚。

Propagation.MANDATORY:如果当前外部方法存在事务,则内部方法加入该事务;如果当前外部方法没有事务,则内部方法抛出异常。

例如:A方法中调用了B,若A方法有事务,则B不创建事务;若A方法没有事务,则抛出异常。

Propagation.REQUIRES_NEW:无论外部方法是否存在事务,内部方法都会创建新的事务。且创建的事务之间互不打扰。

例如:A方法中调用了B,无论A是否有事务,B都会创建新的事务。

Propagation.NOT_SUPPORTED:无论外部方法和内部方法是否存在事务,都将事务挂起,以非事务方式运行。

例如:A方法中调用了B,无论A和B是否有事务,最终都以非事务运行。

Propagation.NEVER:以非事务方式运行,若外部或内部方法存在事务,则抛出异常。

例如:A方法中调用了B,若A或B存在事务,则抛出异常。

Propagation.NESTED:若外部方法存在事务,则内部方法创建一个事务作为当前事务的嵌套事务来运行;如果当前外部方法没有事务,则内部方法创建一个新的事务。

(2)Propagation.REQUTRED和Propagation.NESTED的区别

共同点:若事务全部执行成功,二者没有区别;

不同点:若有部分事务抛出异常,Propagation.REQUTRED是加入外部方法的事务,会导致事务全部回滚;Propagation.NESTED嵌套事务,只会有部分回滚。嵌套事务进入之后相当于新建了一个保存点,而回滚时只回滚到当前保存点。

(3)设置@Transactional注解的propagation属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电机特性学习

电机特性 电机堵转: 电机堵转的原理 玻璃升降器: 工作电压 升降器在 9V~16V 电压下应运行平稳,不允许有异音和卡滞现象。 工作电流 升降器的工作电流不大于 12A,堵转电流不大于 28A。 堵转 力 升降器 堵转 力应 不小于 212N。 玻璃升降器结构 电动车窗…

删除数据表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后,就会把数据表 emp30 删除 在…

一起玩儿3D打印机——01 3D打印机初探

摘要:本文介绍3D打印技术的基本知识以及3D打印机的结构分类和组成 3D打印技术这几年得到了快速的发展,在一些特定领域和特定行业逐渐被越来越多的人所接受并大量使用。与之相关的供应链和产业链也日益壮大,并形成了完善的体系。 这次之所以…

蓝桥杯刷题7

目录 1. 字母数 2. 列名 3. 大乘积 4. 最大连通 5. 星期几 1. 字母数 public class Main {public static void main(String[] args) {int num 2023;while(true) {String mInteger.toString(num,16);if(m.matches("^[a-f]$")){System.out.println(num);break;}n…

Linux环境安装配置JDK11

文章目录 第一步:上传JDK11安装包第二步:解压安装包第三步:修改环境变量第四步、测试是否安装成功总结 JDK 11 是 Java 开发工具包(Java Development Kit)的一个版本,它是由 Oracle 公司开发和发布的。以下…

集成Mybatis Generator dao层代码生成

Mybatis Generator dao层代码生成 介绍 我们在使用mybatis开发的时候,需要去写表的基本的crud,这些咱们通常定义到dao层里面去,而mybatis generator可以帮我们把这件事情自动完成,大大节省时间并且可以规范dao层的代码。 sprin…

关于并发编程的一些总结

并发编程 1.synchronized是什么? synchronized是Java中的一个关键字,主要是为了解决多个线程访问共享资源的同步性,可以保证被它修饰的代码块或方法在任何时间至多只有一个线程执行。 2.synchronized的进化史? 在早期Java版本中&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)

摘要:本研究详述了一种采用深度学习技术的火焰检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别火焰目…

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

趣学前端 | JavaScript标准库

背景 最近睡前习惯翻会书,重温了《JavaScript权威指南》这本书。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。 JavaScript标准库 今天阅读的章节是JavaScript标准库,…

数据库规范化设计案例解析

1.介绍 数据库规范化设计是数据库设计的一种重要方法,旨在减少数据库中的冗余数据,提高数据的一致性,确保数据依赖合理,从而提高数据库的结构清晰度和维护效率。规范化设计通过应用一系列的规范化规则(或称“范式”&a…

【死磕Elasticsearch】从实战中来,到实战中去

文章目录 写在前面:1、索引阻塞的种类2、什么时候使用阻塞?场景1:进行系统维护场景。场景2:保护数据不被随意更改场景。场景3:优化资源使用的场景。场景4:遵守安全规则场景。 3、添加索引阻塞API4、解除设置…

HarmonyOS预览功能报错:[webpack-cli] SyntaxError: Unexpected end of JSON input

harmonyos预览功能报错 在使用DevEco Studio写页面&#xff0c;进行预览的时候报错&#xff1a; [Compile Result] [webpack-cli] SyntaxError: Unexpected end of JSON input [Compile Result] at JSON.parse (<anonymous>) [Compile Result] at updateCached…

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…

20240312-2-贪心算法

贪心算法 是每次只考虑当前最优&#xff0c;目标证明每次是考虑当前最优能够达到局部最优&#xff0c;这就是贪心的思想&#xff0c;一般情况下贪心和排序一起出现&#xff0c;都是先根据条件进行排序&#xff0c;之后基于贪心策略得到最优结果。 面试的时候面试官一般不会出贪…

2024-3-12尾盘一致转分歧

安彩高科开一字符合预期&#xff0c;昨天风光储锂电大涨&#xff0c;理应给大溢价&#xff0c;超预期是 艾艾精工 高开秒板&#xff0c;立航科技高开分歧反核承接良好回封一致&#xff0c;带动了低空经济板块高潮&#xff0c;低空经济开始往 碳纤维 方向扩散。盘中我说了 三晖…

Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版

学习LOAD CSV&#x1f680; 在使用Neo4j进行大量数据导入的时候&#xff0c;发现如果用代码自动一行一行的导入效率过低&#xff0c;因此明白了为什么需要用到批量导入功能&#xff0c;在Neo4j中允许批量导入CSV文件格式&#xff0c;刚开始从网上的中看了各种半残的博客或者视频…

pytest测试框架使用基础07 fixture—parametrize获取参数的几种常用形式

【pytest】parametrize获取参数的几种常用形式: a.数据结构 b.文件 c.数据库 d.conftest.py配置一、直接在标签上传参 1.1 一个参数多个值 pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3))示例&#xff1a; import pytest # 单个参数的情况 pytest.…

每日OJ题_牛客另类加法_力扣不用加号的加法

目录 另类加法 不用加号的加法 另类加法 另类加法__牛客网 class UnusualAdd {public:int addAB(int A, int B) {while (B ! 0) {int C ((B & A) << 1); // 进位A ^ B; // 无进位相加B C; // 直到进位不为0就跳出循环}return A;} };不用加号的加法 面试题 17.0…