SpringBoot项目的事务实现

news2024/10/6 6:00:34

说明:当业务中的某个功能,需要多个操作组合执行才能完成时(如删除部门,部门下的员工也需要同步删除时),为了保证数据的一致性,需要对这些组合操作添加事务。(参考:http://t.csdn.cn/6PFzL)

(根据部门ID删除员工)

    @Delete("delete from tb_emp where id=#{id}")
    void deleteByDeptId(Integer id);

(根据部门ID删除部门,要求删除部门的同时删除该部门下的所有员工)

    @Delete("delete from tb_dept where id=#{id}")
    void deleteById(Integer id);

Controller层

    @RequestMapping("deleteById")
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);

(员工表)

在这里插入图片描述

(部门表)

在这里插入图片描述

添加事务

在SpringBoot项目中,可以使用@Transactional,给方法添加事务

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动添加算数异常
        int i = 1 / 0;

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);

程序报错,事务未提交,方法未执行成功
在这里插入图片描述

去掉异常,删除ID为3的部门

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

执行成功
在这里插入图片描述
在这里插入图片描述

需要注意的是,如果抛出的是Exception异常,而不是RuntimeException异常,事务会失效。

(删除ID为4的部门,部门被删除,员工并未被删除)

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) throws Exception {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动设置Exception异常
        if (true){
            throw new Exception("发生了错误");
        }

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

因为事务捕捉的异常默认是RuntimeException,即只有发生RuntimeException事务才会回滚。可以在@Tranctionful()注解里添加rollback = Exception.class,表示发生任何异常,都回滚事务。

    @RequestMapping("deleteById")
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(Integer id) throws Exception {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动设置Exception异常
        if (true){
            throw new Exception("发生了错误");
        }

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

事务传播

当事务方法,方法中调用的方法也被事务修饰,此时就存在事务传播。在@Transactional注解中,使用propagation属性设置,常用有以下两个值:

REQUIRED:默认值,表示调用自己的事务执行成功与否,同时也表示自己事务的状态;

REQUIRES_NEW:表示调用自己的事务执行成功与否,不会影响自己事务的执行。

例如在删除部门方法中设置一个删除部门日志方法,部门删除执行成功与否,该日志方法都执行

(DeptLogServiceImpl类,设置该事务的事务传播为:REQUIRES_NEW)

    @Autowired
    private DeptLogMapper deptLogMapper;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertDeptLog(DeptLog deptLog){
        deptLogMapper.insert(deptLog);
    }

(DeptLogMapper类)

    @Insert("insert into dept_log(create_time,description) values(#{createTime},#{description})")
    void insert(DeptLog log);

    @RequestMapping("deleteById")
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(Integer id) throws Exception {
        try {
            // 删除该部门
            deptMapper.deleteById(id);

            if (true){
                throw new Exception("发生了错误");
            }

            // 删除部门对应部门ID的员工
            empMapper.deleteByDeptId(id);
        }finally {
            // 记录删除部门日志
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("删除了ID" + id + "的部门");

            deptLogService.insertDeptLog(deptLog);
        }
    }

(删除ID为2的部门)

在这里插入图片描述

(删除部门失败,不影响添加日志)

在这里插入图片描述

在这里插入图片描述

需要注意的是,事务传播属性是加在需要设置的方法上(添加日志方法),而不是调用方法上(删除部门方法)

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

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

相关文章

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法,通过记录读卡器或智能手机打开时的电源 LED,使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知,这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

一、elasticsearch的简介与安装

目录 一、Elasticsearch下载 二、安装 三、启动 四、安装可视化插件(elasticsearch-head) 1、下载地址 2、解压缩下载好的压缩文件 3、进入解压缩目录 五、解决跨域问题 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方…

端午节出行的小贴士——行之安,乐之逍

亲爱的朋友们, 随着端午节的到来,想必许多人已经开始期待那份出游的快乐与解脱。无论你是期待漫步在宁静的田野小径,还是在繁华的城市中探索,这篇文章都会给你一些实用的端午节出行建议,帮助你尽情享受旅程。 首先&a…

Airtest图像识别测试工具原理解读最佳实践 | 京东云技术团队

1 Airtest简介 Airtest是一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli,引用该框架后,不再需要一行行的写代码,通过截取按…

如何利用数据化营销助力新零售企业发展?”

​“新零售”这个概念诞生至今已有5年,但对于其具体的定义,行业内仍然有许多争议。有人认为“新零售”是对传统零售模式的颠覆;也有人认为“新零售”就是将线上和线下相结合。不论如何,在这个不断变化的行业中,新零售企…

使用omp技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数(词频统计),并将统计结果按单词字典序输出到屏幕上。 注:在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

智能数字资产管理系统,全面提升企业的管理效率

智能数字资产管理系统,能够为企业带来很多成果,提高企业管理效率。让程序简单化,提升组织生产率,可以帮助企业以更有效的方式企业实现目标。 研发背景 智能数字资产管理系统 系统功能 1.可以实现数字资产全生命周期的管理&#…

大厂月薪15K被优化,面试 “吹牛” 入职小厂,月薪25K 好慌...

某大厂员工被优化,面试“吹牛”入职小厂,纠结去不去,心里有点慌。 作为一个从福报厂出来的HR,目前在100多人的小厂当HR总监。面对这种情况已经是见怪不怪了。作为小厂,没有大厂那么严格的背调,所以有些来自…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用,就是让Internet上的其他用户,可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后,在Internet下的其它电脑、手机等网络设备,将无法自接访问你电脑…

C++ 反汇编简要

摘要:本文主要描述x86_64机器中C代码在汇编中的具体代码。   关键字:cpp,IA32,asm   注意:本书假定你拥有基本的C软件开发能力,能够理解基本的C代码。并且熟悉汇编代码,了解基本的取址模式并且熟悉IA32指令集&…

基于LDA与PCA算法的鸢尾花数据集二维投影比较

目录 1. 作者介绍2. LDA和PCA算法介绍2.1 LDA算法2.2 PCA算法2.3 两个算法的区别与联系 3. 实验过程3.1 数据集介绍3.2 算法流程3.3 核心算法介绍3.4 完整代码3.5 实验结果与分析 1. 作者介绍 王鑫,男,西安工程大学电子信息学院,2022级研究生…

70+页实战经验分享,《研发效能红宝书》重磅发布 | 附下载

研发效能提升方法从来没有标准答案,不同角色的人,以不同的目标搭建效能体系的方法千差万别,但又存在互通之处。所以做研发效能更需要多方借鉴,然后因地制宜,找到适合自己的方式。于是,我们汇集业界多位效能…

shell脚本解析 01

一、shell 概述 1.shell 的两层含义: 既是一种应用程序,又是一种程序设计语言 a.作为应用程序: 交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能。称之为 shell 命令解析器。shell 是用户和…

DreamBooth论文解读

文章目录 摘要问题算法3.1 文生图扩散模型3.2 个性化文生图模型3.3 特定类别先验保留损失 实验评估方式比较消融实验PPL类别先验 应用限制 结论 论文: 《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》 project&#xf…

yueyin uart ip 使用说明文档

目录 1 概述2 IP功能3 IP端口4 收发数据时序4.1 Uart_tx接口4.2 Uart_rx接口5 获取IP地址 1 概述 本文用于讲解yueyin IP 的uart ip(串口/rs422/rs485/rs232)的功能,以及使用说明,方便使用者快速上手。 版本:V1.0.0 编…

行业报告 | 清华大学AIGC发展研究1.0震撼发布!(技术+未来篇)

文 | BFT机器人 01 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤: 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键步骤…

基于matlab对传感器阵列中的扰动和元件故障进行建模(附源码)

一、前言 本示例展示了如何对传感器阵列中的幅度、相位、位置和模式扰动以及晶片故障进行建模。 二、振幅扰动 本节介绍如何在 10 个晶片的均匀线性阵列 (ULA) 上添加增益或幅度扰动。将扰动视为统计上独立的零均值高斯随机变量,标准差为 0.1…

Linux内核进阶----整体框架及子系统概览

目录 1、概述 2、核心抽象及设计选型 2.1. 对进程和内核的抽象 2.2. 对进程地址空间的抽象 2.3. 支持可重入可抢占的内核 2.4. 放松管控与努力回收 2.5. 单块结构内核动态加载模块 2.6. 为系统中的一切活动打拍子 2.7. 一切皆文件的理念 3、Linux整体架构模块说明 3.…

Pnpm实现Monorepo风格项目搭建

Monorepo是什么 与Monorepo对比的是MutiRepo。对于一个复杂的前端架构通常会有多个npm package组成。repo指的是版本仓库。如果多个package放在一个repo仓库中就叫做monorepo。 目前有不少大型开源项目采用了这种方式,如 Babel,React, Meteor, Ember, …

基于Hexo和Butterfly创建个人技术博客,(12) 定制化博客站点高级功能,如搜索、在线聊天、自定义样式等

Butterfly官方网站,请 点击进入 部分特效来源于网站的总结,请点击进入 本章目标: 选择自己需要的内容,然后加以实现。本文中涉及的修改方式主要包含三种:1、修改源码;2、扩展源码;3、添加插件&a…