Spring事务管理学习记录

一、概念

事务(Transaction)是指一组操作的集合,这些操作要么全部成功,要么全部失败。事务的四大特性(ACID)确保了数据的完整性和一致性:

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部回滚。

  2. 一致性(Consistency):事务完成后,数据库的状态必须是合法的。

  3. 隔离性(Isolation):多个事务同时执行时,事务之间不会互相干扰。

  4. 持久性(Durability):事务提交后,所做的更改将永久保存。

@Transactional 注解解读@Transactional 是 Spring 中声明式事务管理的核心注解,用于标识某个方法或类需要事务支持。

  • 作用范围

    • 可以标注在类上:表示该类的所有公共方法都受事务管理。

    • 可以标注在方法上:仅对特定方法启用事务。

  • 常用参数

    • propagation:定义事务的传播行为(见下文详细介绍)。

    • isolation:设置事务的隔离级别,决定事务之间如何相互隔离。

    • rollbackFor:指定哪些异常会触发事务回滚,默认回滚运行时异常。

    • readOnly:标志事务是否只读,优化查询性能。

注意:

   Spring 默认在运行时异常(如 RuntimeException)或错误时回滚事务,但不会回滚编译时异常(如 IOException)。如果需要回滚编译时异常,可以在 @Transactional 注解中通过 rollbackFor 参数显式指定。例如:@Transactional(rollbackFor = Exception.class)

事务的传播行为: 传播行为定义了当前事务方法在被调用时与外部事务的关系。

  • REQUIRED:默认传播行为,如果当前有事务则加入该事务,如果当前没有事务,则创建新事务。传播行为定义了事务方法在调用时的执行方式,例如是否加入现有事务,是否创建新事务等。REQUIRED 是最常见的传播行为,适用于需要与外部事务共享同一个事务上下文的场景。

  • REQUIRES_NEW:每次都会创建新事务。这种传播行为适用于需要完全独立于外部事务的操作场景。例如,当需要确保某段逻辑无论外部事务的状态如何都必须执行时,可以使用 REQUIRES_NEW 来强制开启新事务。

  • NESTED:嵌套事务,依赖外部事务。嵌套事务允许一个事务包含多个子事务。如果嵌套的事务回滚,外部事务可以选择继续执行,也可以回滚整个事务。

二、代码示例

Controller层:

@RestController
public class EmpController {@Autowiredprivate EmpService empService;@PostMappingpublic Result add(@RequestBody Emp emp) {log.info("新增员工: {}", emp);empService.add(emp);return Result.success();}
}

Mapper层:

@Service
public class EmpService {@Autowiredprivate EmpMapper empMapper;@Autowiredprivate EmpExprMapper empExprMapper;@Transactionalpublic void add(Emp emp) {// 设置创建和更新时间emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());// 新增员工信息empMapper.add(emp);// 新增员工的工作经历List<EmpExpr> exprList = emp.getExprList();if (!CollectionUtils.isEmpty(exprList)) {exprList.forEach(empExpr -> {empExpr.setEmpId(emp.getId());});empExprMapper.addBatch(exprList);}}
}

代码解析

  1. @Transactional

    • 标注在 add 方法上,表示该方法中的所有数据库操作将作为一个事务处理。

    • 如果方法内出现异常,所有操作都会回滚,确保数据一致性。

  2. 回滚机制:

    • 如果在新增经历时出现异常(例如 empExprMapper.addBatch 抛出异常),整个事务都会回滚,之前插入的员工信息也会撤销

三、总结

  1. 事务的声明方式

    • 使用 @Transactional 注解简化事务管理。

    • 注解可以加在方法上或类上,类上注解适用于所有方法,但一般推荐加载Service层的特定方法上。

  2. 事务的回滚

    • Spring 默认在运行时异常(如 RuntimeException)或错误时回滚事务。

    • 如果需要回滚检查型异常,可以在 @Transactional 注解中设置 rollbackFor 属性。

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

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

相关文章

长城上,低空下,北京联通点亮5G-A的时代星光

2024年&#xff0c;被认为是5G-A的商用元年。在这个关键节点&#xff0c;大部分普通人最关心的问题可能是5G-A的引入、网络能力的提升&#xff0c;究竟能给我们带来哪些实用价值&#xff1f;在城市中到底有什么应用场景&#xff1f; 面对上述大众关切的问题&#xff0c;首善之都…

Vue使用Mockjs插件实现模拟数据

官方文档&#xff1a;Mock.js 一.引言 在前端开发过程中&#xff0c;我们经常会遇到后端接口尚未完成&#xff0c;但前端需要进行页面构建和功能测试的情况。这时候&#xff0c;Mockjs就如同救星一般出现了。Mockjs 是一款能够模拟生成随机数据&#xff0c;拦截 Ajax 请求并返…

阅读方法论

选择固有缺陷,选项是对比出来的

Java 百度网盘300文件一组 文件批量重命名

按260个文件一个文件夹 public static void main(String[] args) {String path "F:\\壁纸爬虫合集\\爬虫文件夹No1";int fileCount 0;List<List<File>> folderList new ArrayList<>();List<File> folderFiles new ArrayList<>();f…

js原型、原型链和继承

文章目录 一、原型1、prototype2、constructor 二、原型链1、字面量原型链2、字面量继承3、构造函数的原型链4、Object.create5、Object.setPrototypeOf 三、继承1、构造函数继承2、原型链继承3、组合继承 四、常见链条1、Function2、Object.prototype 继承是指将特性从父代传递…

在Manjaro Gnome桌面的基础上安装Budgie桌面环境

在Manjaro上安装Budgie桌面环境 Budgie是Solus团队开发的一种简单而优雅的桌面环境。 Budgie是由Solus项目主要开发的流行桌面环境&#xff0c;与GNOME堆栈紧密集成。它提供了简单而优雅的用户体验&#xff0c;并且可用于大多数发行版&#xff0c;如Arch、Debian、Manjaro等。…

芯片测试-smith圆图

smith圆图 &#x1f4a2;smith圆图的故事&#x1f4a2;&#x1f4a2;smith圆图中的各部分来历&#x1f4a2;&#x1f4a2;公式推导&#x1f4a2;&#x1f4a2;等电阻圆特点&#x1f4a2;&#x1f4a2;等电抗圆&#x1f4a2;&#x1f4a2;等电抗圆特点&#x1f4a2; &#x1f4a…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代&#xff0c;MSP&#xff08;云管理服务提供商&#xff09;犹如一个帮助企业上云、用云、管理云的专业管家&#xff0c;在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来&#xff0c;也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

树莓派/Jetson Nano/...aarch64:安装Miniforge 或 Mambaforge

目录 一、下载链接&#xff08;我以miniforge为例&#xff09;二、赋予脚本可执行权限三、运行安装脚本四、添加环境变量 Miniforge 或 Mambaforge是Miniforge 项目提供了针对多种架构&#xff08;包括 aarch64&#xff09;的轻量级 Conda 发行版&#xff0c;它们是 Miniconda …

腾讯阅文集团Android面试题及参考答案

Java 的基本数据类型有哪些?分别简述一下。 Java 的基本数据类型共有 8 种,可分为 4 类:整数类型、浮点类型、字符类型和布尔类型 。 整数类型:包括 byte、short、int 和 long。byte 占 1 个字节,取值范围是 - 128 到 127,适用于存储一些小范围的整数,如文件流中的字节数…

白嫖域名,无套路,无需手机注册,支持A解析,TXT解析

注册简单&#xff0c;连邮箱都不需要&#xff0c;不用填写任何资料。 支持A、redirectURL、AAAA、TXT等类型的记录&#xff0c;可以创建子域名 注册地址&#xff1a;Free DDNS 打开首页&#xff0c;输入想要的域名&#xff0c;点查询按钮。如果可用&#xff0c;再点击提交按钮…

SQL进阶技巧:非等值连接--单向近距离匹配

目录 0 场景描述 1 数据准备 2 问题分析 ​编辑 ​编辑 3 小结 数字化建设通关指南 0 场景描述 表 t_1 和表 t_2 通过 a 和 b 关联时&#xff0c;有相等的取相等的值匹配&#xff0c;不相等时每一 个 a 的值在 b 中找差值最小的来匹。 表 t_1&#xff1a;a 中无重复值…

【Linux】软件包管理与vim工具使用详解

Linux 软件包管理与vim工具使用详解 什么是软件包Liunx安装软件Linux下载软件的过程&#xff08;Ubuntu、Centos、other&#xff09; centos7配置新的yum源操作系统的好坏评估---生态问题如何安装软件查看软件包卸载软件 Linux编辑器-vim使用简单vim配置Linux编译器-gcc/g使用预…

Vue如何加载十万条数据

加载十万条数据到 Vue 应用中是一个相对复杂的问题&#xff0c;主要因为渲染大量数据可能会导致性能瓶颈&#xff0c;尤其是在前端性能较低的设备上。为了确保加载大量数据时&#xff0c;页面不会卡顿或崩溃&#xff0c;我们通常采取一些优化手段&#xff0c;以下是几种常用的方…

【Ant Design Pro】1. config 配置

前置说明 这里我使用的是 simple 版本&#xff0c;并结合 antd pro 脚手架搭建&#xff08;现在默认使用为 umi4 版本&#xff09;&#xff1a; 虽然这个文档好像已经好久没有更新了。 config 文件&#xff1a; config.ts // https://umijs.org/config/ import { defineConfi…

《实战OpenCV系列》专栏介绍

简介 本专栏由浅入深&#xff0c;详细介绍了使用OpenCV进行图像/视频处理的各方面知识&#xff0c;包括&#xff1a;图像显示、图像的数学运算、图像的裁剪与拼接、图像的像素操作、几何变换、直方图、图像滤波、色彩空间转换、边缘检测、形态学操作、模板匹配、视频处理、图像…

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…

Vue 项目中有哪些内存泄漏的场景,以及预防内存泄漏技巧

前言 即便是功能强大的 Vue.js 也无法完全避免内存泄漏的问题&#xff0c;内存泄漏不仅会影响应用的性能&#xff0c;还可能导致浏览器崩溃。因此&#xff0c;识别和解决 Vue 项目中的内存泄漏问题是确保项目稳定性和性能的关键。 本文将通俗易懂地介绍 Vue 项目中常见的内存泄…

微信小程序Webview与H5通信

背景 近期有个微信小程序需要用到web-view嵌套H5的场景&#xff0c;该应用场景需要小程序中频繁传递数据到H5进行渲染&#xff0c;且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大&#xff0c;显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…

【JAVA】接口杂谈:Java中的比较器(Comparator 接口)

这篇来介绍自定义类型对象的比较方法&#xff0c;利用Comparable 接口和 Comparator 接口。 目录 问题引入&#xff1a; 一、Comparable 接口 1.1比较学生的年龄 方法&#xff1a; 结果&#xff1a; 1.2比较学生的姓名 方法&#xff1a; 结果&#xff1a; 1.3 案例再…