当前位置: 首页 > news >正文

Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

        关于 @Transactional 注解的基本使用,推荐看Spring 声明式事务 @Transactional(基本使用)

概述

        本篇博客主要学习 @Transactional 注解当中的三个常⻅属性:

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

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

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

rollbackFor(异常回滚属性)

        @Transactional 默认只在遇到运⾏时异常( RuntimeException 及其子类)和Error时才会回滚,其余的异常不回滚(在首行推荐的博客中有详细的介绍

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

        如下代码:

        在  @Transactional 注解中设置了 rollbackFor 属性,对所有的 Exception 异常都进行回滚,此时当方法抛出的是 IOException() 时事务也会自动进行回滚

 // rollbackFor 表示事务要对抛出的哪些异常进行回滚@Transactional(rollbackFor ={Exception.class})@RequestMapping("/registry6")public String registry6(String userName,String password) throws IOException {//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");try {int a=10/0;}catch(Exception e){throw new IOException();}return "注册成功";}

        

Isolation(事务的隔离级别)

MySQL 事务隔离级别

SQL 标准定义了四种隔离级别, MySQL 全都⽀持.这四种隔离级别分别是:

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

        2. 读提交(READ COMMITTED):读已提交,也叫提交读.该隔离级别的事务能读取到已经提交事务的数据,该隔离级别不会有脏读的问题.但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询可能会得到不同的结果,这种现象叫做不可重复读

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

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

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

        

        事务隔离级别与存在的问题:

Spring 事务隔离级别

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

        1. Isolation.DEFAULT :以连接的数据库的事务隔离级别为主.( @Transactional 默认的隔离级别)

        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)

propagation( 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 :如果父方法存在事务,则子方法创建⼀个事务作为当前事务的嵌套事务来运⾏. 如果父方法没有事务,则子方法创建⼀个新的事务.

         Spring 中事务的传播机制可以通过 @Transactional 中的 propagation 属性进⾏设置:

@Transactional(propagation = Propagation.REQUIRED)

        

        

相关文章:

Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

关于 Transactional 注解的基本使用,推荐看Spring 声明式事务 Transactional(基本使用) 概述 本篇博客主要学习 Transactional 注解当中的三个常⻅属性: 1. rollbackFor:异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型 …...

CSS之高度塌陷和外边距塌陷

目录 1.高度塌陷(原因,如何解决) 【概念介绍】 【解决办法】 【概念介绍-BFC】 【拓展-BFC的触发条件】 2.外边距塌陷 (原因,如何解决) 【概念介绍】 【两种情况】 1.相邻块元素 2.嵌套块元素 【…...

基于SpringBoot Vue美食网站系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…...

哪吒汽车与经纬恒润合作升级,中央域控+区域域控将于2024年落地

近日,在2024哪吒汽车价值链大会上,哪吒汽车与经纬恒润联合宣布合作升级,就中央域控制器和区域域控制器展开合作,合作成果将在山海平台新一代车型上发布。 哪吒汽车首席技术官戴大力、经纬恒润副总裁李伟 经纬恒润在智能驾驶领域拥…...

php学习-实战项目

登录注册 login_db_connect.php 连接数据库 <?php //用于登录界面数据库连接 //设置字符集 header(Content-type:text/html;charsetutf8);//连接数据库 $conmysqli_connect("localhost","root","root","lms"); if (mysqli_conne…...

【项目日记(四)】第一层: 线程缓存的具体实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…...

海思 tcpdump 移植开发详解

目录 前言 一、开发环境 二、tcpdump 源码下载 三、交叉编译 libpcap 四、交叉编译 tcpdump 五、tcpdump 移植到板子运行 前言 本章内容将讲解&#xff0c;如何在海思平台交叉编译、移植&#xff0c;并基于静态库生成的 tcpdump 网络抓包工具。 一、开发环境 SS…...

Javascript--流程控制

目录 数据类型转换 自动类型转换 强制类型转换 流程控制语句 顺序流程 选择流程 单分支 双分支 多分支 switch 循环流程 for循环 while循环 do...while循环 如何选择 continue和break 循环案例 数据类型转换 由于 javascrip 这个语言它是弱类型语言&#xff0c…...

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机&#xff08;RD8G37&#xff09;超声波一体测距传感器实现简单的测距测速仪。 测距仪演示效果 新定义RD8G37Q48RJ开发板 超声波测距模块&#xff1a; 8位并口屏 1、main.c unsigned short timeConsuming0; unsigned int oldDistance;void rectClearS…...

Unity中URP下获取每一个额外灯数据

文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言 在上一篇文章中&#xff0c;我们知道了URP下是怎么获取额外灯数量的。 Unity中URP下获取额外灯数量 在这篇文章中&#xff0c;我们…...

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …...

Tomcat Notes: Web Security, HTTPS In Tomcat

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…...

智能小程序登陆能力开发文档及示例代码

小程序登录 涂鸦官方提供了登录能力&#xff0c;开发者可以通过相关 API 获取 App 的用户身份标识&#xff0c;快速的建立小程序内的用户体系。 登录流程 说明 需要调用 ty.login() 获取 临时登录凭证 code&#xff0c;并将 code 传到开发者服务器开发者服务器调用涂鸦云开发…...

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…...

openssl3.2/test/certs - 041 - 1024-bit leaf key

文章目录 openssl3.2/test/certs - 041 - 1024-bit leaf key概述笔记END openssl3.2/test/certs - 041 - 1024-bit leaf key 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\test_certs\041\my_openssl_linux_…...

「创新引领未来」科东软件荣获第十二届中国创新创业大赛(广东·广州赛区)优胜奖

近日&#xff0c;广州市科学技术局公布第十二届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2023年广州科技创新创业大赛常规赛拟获奖企业名单。科东软件凭借国产化技术创新优势、强大的应用场景落地能力和丰富的行业解决方案&#xff0c;荣获第十二届中国创新创业…...

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…...

spire.doc合并word文档

文章目录 spire.doc合并word文档1. 引入maven依赖2. 需要合并的word3. 合并文档代码4. 合并结果 spire.doc合并word文档 1. 引入maven依赖 <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://r…...

蓝桥杯官网填空题(01串的熵)

问题描述 答案提交 这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。 import java.util.*;public class Main {public static void main(String[] args) {for(double zero1;zero<2333…...

【CodeTop】TOP 100 刷题 51-60

文章目录 51. 缺失的第一个正数题目描述代码与解题思路 52. 训练计划 II题目描述代码与解题思路 53. 子集题目描述代码与解题思路 54. 最小覆盖子串题目描述代码与解题思路 55. 从前序与中序遍历序列构造二叉树题目描述代码与解题思路 56. 零钱兑换题目描述代码与解题思路 57. …...

用PyTorch复现掌纹识别顶会论文:从VGG16到ResNet152的模型蒸馏踩坑实录

从VGG16到ResNet152&#xff1a;掌纹识别模型蒸馏实战中的关键挑战与解决方案 掌纹识别作为生物特征识别领域的重要分支&#xff0c;近年来在深度学习技术的推动下取得了显著进展。然而&#xff0c;当我们将论文中的理论模型转化为实际可运行的代码时&#xff0c;往往会遇到一系…...

论文写作“黑科技”:书匠策AI,让课程论文创作如虎添翼!

在学术探索的征途中&#xff0c;每一位学子都渴望拥有一把开启智慧之门的钥匙&#xff0c;尤其是在面对课程论文这一挑战时&#xff0c;更是希望能有得力助手助自己一臂之力。今天&#xff0c;就让我带你揭开书匠策AI科研工具的神秘面纱&#xff0c;看看它是如何成为你课程论文…...

手把手教你排查Windows系统错误1114:从DLL加载原理到MySQL驱动修复

深入解析Windows系统错误1114&#xff1a;从DLL加载机制到MySQL驱动故障修复实战 当你在配置MySQL ODBC数据源时突然遭遇"系统错误1114&#xff1a;动态链接库(DLL)初始化例程失败"的红色警告框&#xff0c;那种挫败感我深有体会。这个看似简单的错误背后&#xff0…...

旋变信号处理中的相位问题:如何用仿真工具分析并补偿滤波电路带来的相移

旋变信号相位补偿实战&#xff1a;从仿真到硬件设计的全链路解决方案 电机控制系统中&#xff0c;旋转变压器&#xff08;旋变&#xff09;作为高精度位置传感器&#xff0c;其信号质量直接影响闭环控制性能。然而工程师们常遇到一个棘手问题——旋变反馈信号与激励信号之间的…...

正则表达式实战:精准校验日期时间格式的五大场景

1. 为什么我们需要校验日期时间格式&#xff1f; 在日常开发中&#xff0c;数据校验是最基础也最容易出问题的一环。就拿日期时间来说&#xff0c;你可能遇到过用户把"2023年2月30日"这种不存在的日期提交到系统&#xff0c;或者日志文件里的时间戳格式五花八门&…...

Rocky Linux 9最小化安装后,我第一时间会做的10个安全加固设置(新手必看)

Rocky Linux 9最小化安装后的10个关键安全加固指南 当你完成Rocky Linux 9的最小化安装&#xff0c;系统虽然干净但远未达到安全标准。作为企业级RHEL的替代品&#xff0c;Rocky Linux继承了其稳定性与安全性基因&#xff0c;但默认配置仍需优化才能抵御现代网络威胁。本文将分…...

保姆级教程:用ESPHome给旧ESP8266设备(如NodeMCU V2)刷机,无缝接入Home Assistant

旧ESP8266设备焕新指南&#xff1a;从吃灰到智能家居中枢的完整实战 翻箱倒柜时发现几块落满灰尘的NodeMCU V2开发板&#xff1f;别急着扔掉——这些"过时"的硬件依然能在智能家居系统中大放异彩。本文将带你完成从硬件检测到高级功能集成的全流程改造&#xff0c;让…...

Pixel Mind Decoder 参数调优实战:平衡推理速度与识别准确率

Pixel Mind Decoder 参数调优实战&#xff1a;平衡推理速度与识别准确率 1. 为什么需要参数调优 当你第一次使用Pixel Mind Decoder时&#xff0c;可能会发现同样的输入有时会产生不同的输出质量。这就像开车时需要在速度和油耗之间找到平衡点一样&#xff0c;AI模型的参数调…...

OpenClaw备份策略:Qwen3-32B配置与技能的安全迁移

OpenClaw备份策略&#xff1a;Qwen3-32B配置与技能的安全迁移 1. 为什么需要备份OpenClaw&#xff1f; 上周我的开发机突然硬盘故障&#xff0c;导致辛苦配置两个月的OpenClaw环境全部丢失。那一刻我才意识到&#xff1a;当AI助手深度融入工作流时&#xff0c;配置备份不再是…...

告别繁琐操作:一键下载电子课本的智能解决方案

告别繁琐操作&#xff1a;一键下载电子课本的智能解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为获取教学资源而四处奔波吗&#xff1f;还在面对复…...