【JavaEE进阶】 @Transactional详解

文章目录

  • 🍃前言
  • 🌲rollbackFor(异常回滚属性)
  • 🎄事务隔离级别
    • 🚩MySQL事务隔离级别
    • 🚩Spring事务隔离级别
  • 🎋Spring事务传播机制
    • 🚩什么是事务传播机制
    • 🚩事务有哪些传播机制
  • ⭕总结

🍃前言

本篇博客的将讲述 @Transactional注解的使用细节

主要学习 @Transactional 注解当中的三个常见属性:

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

  2. Isolation:事务的隔离级别.默认值为 Isolation.DEFAULT

  3. propagation:事务的传播机制.默认为Propagation.REQUIRED

🌲rollbackFor(异常回滚属性)

@Transactional 默认只在遇到运行时异常和Error时才会回滚,非运行时异常不回滚.

即Exception的⼦类中,除了RuntimeException及其⼦类.

在这里插入图片描述

如果我们需要所有异常都回滚,需要来配置 @Transactional 注解当中的 rollbackFor 属性,通过 rollbackFor 这个属性指定出现何种异常类型时事务进行回滚

代码如下所示:

@Transactional(rollbackFor = Exception.class)

🎄事务隔离级别

我们先来看一下MySQL事务隔离级别都有那些

🚩MySQL事务隔离级别

SQL标准定义了四种隔离级别,MySQL全都⽀持.这四种隔离级别分别是:
在这里插入图片描述

  1. 读未提交(READUNCOMMITTED): 读未提交,也叫未提交读.该隔离级别的事务可以看到其他事务中未提交的数据.

因为其他事务未提交的数据可能会发⽣回滚,但是该隔离级别却可以读到,我们把该级别读到的数 据称之为脏数据,这个问题称之为脏读.

  1. 读提交(READ COMMITTED): 读已提交,也叫提交读.该隔离级别的事务能读取到已经提交事务的数据,

该隔离级别不会有脏读的问题.但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL
查询可能会得到不同的结果,这种现象叫做不可重复读

  1. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改,即使其他事务已提交.也就可以确保同⼀事务多次查询的结果⼀致,但是其他事务新插⼊的数据,是可以感知到的.这也就引发了幻读问题.可重复读,是MySQL的默认事务隔离级别.

⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,自己重复插⼊时⼜失败(因为唯⼀约束的原因).明明在事务
中查询不到这条信息,但⾃⼰就是插⼊不进去,这个现象叫幻读.

  1. 串⾏化(SERIALIZABLE): 序列化,事务最⾼隔离级别.它会强制事务排序,使之不会发⽣冲突,从⽽解决了脏读,不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多

在数据库中通过以下SQL查询全局事务隔离级别和当前连接的事务隔离级别

select @@global.tx_isolation,@@tx_isolation;

🚩Spring事务隔离级别

Spring 中事务隔离级别有5 种:

  1. Isolation.DEFAULT :以连接的数据库的事务隔离级别为主.
  2. Isolation.READ_UNCOMMITTED :读未提交,对应SQL标准中READ UNCOMMITTED
  3. Isolation.READ_COMMITTED :读已提交,对应SQL标准中READ COMMITTED
  4. Isolation.REPEATABLE_READ :可重复读,对应SQL标准中 REPEATABLE READ
  5. Isolation.SERIALIZABLE :串行化,对应SQL标准中SERIALIZABLE

Spring中事务隔离级别可以通过 @Transactional 中的 isolation 属性进行设置

@Transactional(isolation = Isolation.READ_COMMITTED)

🎋Spring事务传播机制

🚩什么是事务传播机制

事务传播机制就是: 多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的.

比如有两个⽅法A,B都被 @Transactional 修饰,A⽅法调⽤B⽅法

A⽅法运⾏时,会开启⼀个事务.当A调⽤B时,B⽅法本⾝也有事务,此时B⽅法运⾏时,是加⼊A的事务,还是创建⼀个新的事务呢?

这个就涉及到了事务的传播机制.

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题
在这里插入图片描述

而事务传播机制解决的是⼀个事务在多个节点(方法)中传递的问题

在这里插入图片描述

🚩事务有哪些传播机制

@Transactional 注解⽀持事务传播机制的设置,通过propagation 属性来指定传播⾏为.

Spring 事务传播机制有以下 7 种:

  1. Propagation.REQUIRED :默认的事务传播级别.如果当前存在事务,则加⼊该事务.如果当前没有事务,则创建⼀个新的事务.
  2. Propagation.SUPPORTS : 如果当前存在事务,则加⼊该事务.如果当前没有事务,则以⾮事务的⽅式继续运⾏.
  3. Propagation.MANDATORY :强制性.如果当前存在事务,则加⼊该事务.如果当前没有事务,则抛出异常.
  4. Propagation.REQUIRES_NEW :创建⼀个新的事务.如果当前存在事务,则把当前事务挂起.也就是说不管外部方法是否开启事务, Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开启自己的事务,且开启的事务相互独⽴,互不⼲扰.
  5. Propagation.NOT_SUPPORTED : 以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起(不⽤).
  6. Propagation.NEVER : 以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常.
  7. Propagation.NESTED : 如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏.如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED .

可能上述理解起来有点儿抽象,这儿博主给大加举个例子吧

⽐如⼀对新⼈要结婚了,关于是否需要房⼦

  1. Propagation.REQUIRED :需要有房⼦.如果你有房,我们就⼀起住,如果你没房,我们就⼀起买房.(如果当前存在事务,则加⼊该事务.如果当前没有事务,则创建⼀个新的事务)
  2. Propagation.SUPPORTS : 可以有房⼦. 如果你有房,那就⼀起住.如果没房,那就租房.(如果当前存在事务,则加⼊该事务.如果当前没有事务,则以⾮事务的⽅式继续运⾏)
  3. Propagation.MANDATORY :必须有房⼦.要求必须有房,如果没房就不结婚.(如果当前存在事务,则加⼊该事务.如果当前没有事务,则抛出异常)
  4. Propagation.REQUIRES_NEW :必须买新房.不管你有没有房,必须要两个⼈⼀起买房.即使有房也不住.(创建⼀个新的事务.如果当前存在事务,则把当前事务挂起)
  5. Propagation.NOT_SUPPORTED :不需要房.不管你有没有房,我都不住,必须租房.(以非事务⽅式运⾏,如果当前存在事务,则把当前事务挂起)
  6. Propagation.NEVER :不能有房⼦.(以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常)
  7. Propagation.NESTED :如果你没房,就⼀起买房.如果你有房,我们就以房⼦为根据地,做点小⽣意.(如果如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏.如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED )

这里我们需要注意一下NESTED和REQUIRED区别

  • 整个事务如果全部执⾏成功,⼆者的结果是⼀样的.
  • 如果事务⼀部分执⾏成功,REQUIRED加⼊事务会导致整个事务全部回滚.NESTED嵌套事务可以实现局部回滚,不会影响上⼀个方法中执⾏的结果.

嵌套事务之所以能够实现部分事务的回滚,是因为事务中有⼀个保存点(savepoint)的概念,嵌套事务进⼊之后相当于新建了⼀个保存点,而滚回时只回滚到当前保存点

使用方法与上述两个属性使用方法是一样的,进行相应属性值设置即可

@Transactional(propagation = Propagation.REQUIRED)

⭕总结

关于《【JavaEE进阶】 @Transactional详解》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

【SpringMVC】RESTFul风格设计和实战 第三期

文章目录 概述一、 RESTFul风格简介二、 RESTFul风格特点三、 RESTFul风格设计规范3.1 HTTP协议请求方式要求3.2 URL路径风格要求 实战一、需求分析二、RESTFul风格接口设计三、后台接口实现总结模糊查询 有范围 返回多数据用户 添加 与 更新 请求参数接收数据显示用户详情/删除…

进腾讯工作一个月,我想辞职了......

前几天,我在网上看到一个微博。 一个应届的校招生,目前入职腾讯,工作了一个月。这一个月给他的感受是大量的写测试用例,自己写测试用例的能力熟练了不少,测试技能倒是没有多大的提高,真正需要技术的工作却…

软考71-上午题-【面向对象技术2-UML】-UML中的图2

一、用例图 上午题,考的少;下午题,考的多。 1-1、用例图的定义 用例图展现了一组用例、参与者以及它们之间的关系。 用例图用于对系统的静态用例图进行建模。 可以用下列两种方式来使用用例图: 1、对系统的语境建模&#xff1b…

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办?

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办? 在订阅 ChatGPT Plus 时,有时候会出现以下报错 : We are unable to authenticate your payment method. 我们未能验证您的支付方式。 出现 unable to a…

低密度奇偶校验码LDPC(十)——LDPC码的密度进化

一、密度进化的概念 二、规则LDPC码的密度进化算法(SPA算法) 算法变量表 VN更新的密度进化 CN更新的密度进化 算法总结 程序仿真 参考文献 [1] 白宝明 孙韶辉 王加庆. 5G 移动通信中的信道编码[M]. 北京: 电子工业出版社, 2018. [2] William E. Ryan, Shu Lin. Channel Co…

优牛企讯司法涉诉维度全解析,了解这些小白也可以变专家!

在商业的海洋中,信息的掌握就如同舵手对风向的了解。每一条信息都可能成为引领航船前行的关键,尤其是在法律风险的管理上,准确而及时的信息更是企业稳健航行的保障。 优牛企讯,一款专业的企业司法涉诉监控查询工具,它…

SpringMVC03、HelloSpring

3、HelloSpring 3.1、配置版 新建一个Moudle &#xff0c; springmvc-02-hello &#xff0c; 添加web的支持&#xff01; 确定导入了SpringMVC 的依赖&#xff01; 配置web.xml &#xff0c; 注册DispatcherServlet <?xml version"1.0" encoding"UTF-8…

微调模型(Machine Learning 研习之十二)

现在正处于百模乱战的时期&#xff0c;对于模型微调&#xff0c;想必您是有所了解了&#xff0c;毕竟国外的大语言模型一开源&#xff0c;国内便纷纷基于该模型进行微调&#xff0c;从而开始宣称领先于某某、超越了谁。可到头来&#xff0c;却让人发现他们套壳了国外大语言模型…

Linux Ubuntu 部署SVN

最近需要在ubuntu server上部署一个svn&#xff0c;记录 不需要特定版本 如果不需要特定版本&#xff0c;这样安装就是最简单的 sudo apt update然后开始安装 sudo apt install subversion等到安装完成之后执行查看版本命令&#xff0c;如果正常输出那就没问题了 svnadmin …

C++默认参数详解

目录 缺省参数/默认参数概念&#xff1a; 缺省参数的应用场景&#xff1a; 函数定义定义分离时的默认参数&#xff1a; 简单的编译链接&#xff1a; 缺省参数/默认参数概念&#xff1a; 缺省参数/默认参数&#xff1a;通俗点讲就是形参给的那个某个值 func(int a 0); //例…

汽车协议学习

ⅠOBD 1.OBD接口 OBD有16个引脚&#xff0c;每个引脚的电压不同&#xff08;可以对应不同的协议&#xff09; 车端&#xff1a; 16- 9 (短一点点的) 8-1 &#xff08;长一点的&#xff09; 2.基于OBDⅡ的通信协议 CAN &#xff08;ISO-15765&am…

Python-Flask 快学

flask是Python的一个轻型Web框架. 使用pycharm自动创建项目,也可以手动创建,以下是目录的结构: ├── app.py├── static└── templates 一、创建一个简单应用 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "hello world &…

20240309-2-校招前端面试常见问题-NodeJS

校招前端面试常见问题【6】——NodeJS NodeJS Q&#xff1a;NodeJS 的 IO 模型特点是什么&#xff1f;与多线程同步 IO 有什么不同&#xff1f; NodeJS 的 IO 模型&#xff08;更准确的说是 js 的执行环境&#xff0c;也就是 v8&#xff09;的特点是“单线程异步非阻塞”。 …

Linux学习-共用体和枚举,位运算

目录 共用体 ​编辑枚举 位运算 共用体 定义和访问都和结构体类似&#xff1b;区别在于共用体所有的成员变量共享同一片空间&#xff0c;内存空间就是其最大数据类型所占内存的大小&#xff1b; 如果给成员变量2的值&#xff0c;那么成员变量1的值就会被覆盖&#xff1b;主…

实现鼠标移动el-select下拉框的label上面显示出table悬浮窗

首先是对vue代码 实现思路就是在el-option里面放一个span来包裹el-popover&#xff0c;里面在放tabe实现悬浮表格 <el-form-item label"原理图编号"><el-select v-model"data.number" placeholder"请选择" clearable multiple collaps…

外包干了30天,我后悔了。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这次来聊一个大家可能也比较关心的问题&#xff0c;那就是就业城…

枚举赋值及强制转换问题

对枚举进行字符赋值&#xff0c;需要进行强制类型转换之后&#xff0c;才能得到想要的值&#xff0c;如下 typedef enum data {DIRECTION_X X,DIRECTION_Y Y,DIRECTION_Z Z,DIRECTION_T T }NumData;int main() {NumData numdata DIRECTION_Y;count <<"num is&…

第九篇 – 过程发现(Process Discovery)是如何赋能数字化市场营销全过程?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

电路板故障的四大原因--芯片级维修

电路板是我们日常使用的技术的核心。 手机、电视、车辆、路灯和大量其他物品都依赖于电路板&#xff0c;这就是为什么故障可能具有高度破坏性。 电路板出现故障的原因有多种&#xff0c;与潮湿、高温和污垢等常见因素有关。 了解电路板故障的原因可以让您避免未来的故障&#x…

波奇学Linux: 信号捕捉

sigaction:修改信号对应的handler方法 act输入型参数&#xff0c;oldact输出型参数 void (*sa_handler) (int) //修改的自定义函数 sigset_t sa_mask // void handler(int signo) {cout<<"catch a signal, signal number: "<<signo<<endl; } int …