Spring 自调用事务失效分析及解决办法

前言

博主在写公司需求的时候,有一个操作涉及到多次对数据库数据的修改。当时就想着要加 @Transactional注解来声名事务。并且由于一个方法中有太多行了,于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候,IDEA 提示我自调用导致事务不会生效。

所谓Spring子调用,就是在Service方法内,调用另一个加了@Transactional注解的方法,那么这个时候注解失效,要如何解决呢?

1. 事务介绍

在开发中涉及到同事操作多个表的时候,要保证两个操作要么一起成功,要么一起失败。此时就需要用到:事务。

现在一般使用的都是基于 @Transactional 注解的声明式事务

而在使用事务的过程中,需要注意以下几点:

  1. 事务只能应用到 pulic修饰的方法上才会生效。
  2. 事务需要从外部调用(涉及到事务的实现原理:基于动态代理实现的)。Spring自调用会失效。
  3. 建议 @Transactional注解添加到 Service 实现类上。

这些要求或者注意事项官方文档可是明确说明的!

应仅将 @Transactional 注解应用于具有公开可见性的方法。如果对受 protected, private 或 package-visible 修饰的方法使用,则不会引发任何错误,但是被注解的方法不会显示已配置的事务设置。

至于建议加在实现类上,这个只是建议,不过如果加在接口类或接口方法上时,只有配置基于接口的代理才会生效。所以这块还是老老实实的加在实现类或实现类方法上吧。

2. 使用场景

在实际开发中,我们经常会遇到这种情况!

本来这块的代码逻辑就很复杂,导致我们写的方法可能又臭又长,里面有各种逻辑操作。在需要同时操作多个表进行更新的时候,就想着单独抽成一个方法让事务包裹的范围最小,仅仅在同时更新的时候加上事务。但此时会发现事务无法生效。如前言所示。那我们如何解决呢?请看下面的三种方法

3. 解决方案

3.1. 外部调用

自调用不允许,那改成外部调用即可。

再声明一个 Service,把更新表的逻辑放过去。

3.2. 使用编程式事务(不推荐)

使用编程式事务,既然使用声明式事务有这么多的显示,那可以换一种编程式事务!

此方法编写较为复杂,不推荐

此时,哪怕方法是private修饰的,事务都可以生效。

3.3. 调用外部方法,外部方法调用内部方法

那如果我们那又想用注解,又想自调用怎么办呢?

咱们可以参考编程式事务的方式,不就是不让自调用么,我调外部方法,然后外部方法再给我调回来不就可以了。

@Component
public class TransactionalComponent {public interface Cell {void run() throws Exception;}@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public void required(Cell cell) throws Exception {cell.run();}
}

这样的话不就可以通过 TransactionalComponent 调用了么,并且还可以使用 lambda 表达式。

4. 总结

本文注解介绍了事务,以及事务失效的解决办法。综上,博主更推荐也更喜欢用第一种方式来解决自调用事务失效的问题。

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

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

相关文章

黑马2024AI+JavaWeb开发入门Day03-Maven-单元测试飞书作业

视频地址:哔哩哔哩 讲义作业飞书地址:飞书 作业比较简单,随便写了写 package org.example;import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.ju…

常见的数据结构---数组、链表、栈的深入剖析

目录 一、数组(Array) 二、链表(Linked List) 三、栈(Stack) 四、总结 数据结构是算法的基石,是程序设计的核心基础。不同的数据结构适用于不同的场景和需求,选择合适的数据结构能…

KAN-Transfomer——基于新型神经网络KAN的时间序列预测

1.数据集介绍 ETT(电变压器温度):由两个小时级数据集(ETTh)和两个 15 分钟级数据集(ETTm)组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) :描…

【C++算法】20.二分查找算法_x 的平方根

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 69. x 的平方根 题目描述: 解法 暴力解法: 如果x17 从1,2,3,4,5......这些数里面找他们的平方…

阿里云人工智能平台(PAI)免费使用教程

文章目录 注册新建实例交互式建模(DSW)注册 注册阿里云账号进行支付宝验证 新建实例 选择资源信息和环境信息,填写实例名称 资源类型需要选择公共资源,才能使用资源包进行抵扣。目前每月送250计算时。1 * NVIDIA A10 8 vCPU 30 GiB 1 * 24 GiB1 * NVIDIA V100 8 vCPU 32 Gi…

Three.js 相机视角的平滑过渡与点击模型切换视角

在 Three.js 中,实现相机视角的平滑过渡和点击模型切换到查看模型视角是一个常见且有用的功能。这种效果不仅能提升用户体验,还能为场景互动添加更多的动态元素。 1. 基本设置 首先,我们需要创建一个基本的 Three.js 场景,包括相…

【Web】0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单

0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单 html基本骨架语义化标签图片属性a链接 非语义化标签特殊符号标签 列表无序列表结果展示 有序列表结果展示 定义列表结果展示 表格table属性tr属性结果展示 表单单标签form属性input属性selecttextareabu…

判断一个数字是否为质数。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目:判断一个数字是否为质数。 程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整…

iwebsec 靶场 —— SSRF 漏洞

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何…

docker-compose 升级

官方下载地址: https://github.com/docker/compose/releases 下载完放到kali root目录下 # mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose # chmod x /usr/local/bin/docker-compose # docker-compose --version

五天SpringCloud计划——DAY1之mybatis-plus的使用

一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用,但是教都教了,就学了吧,学完之后觉得mybatis-plus中的一些方法还是很好用了,本文作为我学习mybatis-plus的总结提升,希望大家看完之后也可以熟悉myba…

linux运维解决方案专家是做什么的

Linux运维解决方案专家是一位在企业IT系统中负责设计、实施、优化和维护基于Linux操作系统的解决方案的专业人士。他们需要结合业务需求,提供稳定、高效、安全的系统运维方案,同时确保企业IT基础设施的平稳运行。以下是其工作职责、技能要求和常见任务的…

系统实现屏幕横竖屏切换

需求场景 机器默认横屏或者竖屏显示 -强制横竖屏显示 实现思路 旋转 uboot logo 和内核 logo旋转 Android 桌面旋转触摸 这个很好理解: uboot 内核 开机动画都是有界面的,旋转改变方向,同时提供新的横屏或者竖屏logo旋转桌面&#xff0c…

新手开始学习编程选择什么软件比较好?

对于新手学习编程,选择合适的软件和工具非常重要。下面是一些推荐的软件和开发环境,适合初学者使用: 1. 文本编辑器 Visual Studio Code (VS Code): 特点:轻量级、开源、支持多种编程语言(如 JavaScript、…

【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数

Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。 1. 定义与公式 Sigmoid 函数的公式为: 特点 输出范围:(0, 1),适合用…

eBay 基于 Celeborn RESTful API 进行自动化工具集成实践

作者:王斐,ebay Hadoop 团队软件工程师,Apache Kyuubi PMC member,Apache Celeborn Committer。 简介:Apache Celeborn 是一个统一的大数据中间服务,致力于提高不同MapReduce引擎的效率和弹性。为了Spark …

Python 和 Pyecharts 对Taptap相关数据可视化分析

结果展示: 数据来源: Python爬取TapTap 热门游戏信息并存储到数据库(详细版) 目录 结果展示: 数据来源: Python爬取TapTap 热门游戏信息并存储到数据库(详细版 一、引言 二、准备工作 三、…

【Linux】常见指令 + 权限概念

文章目录 一、重要的指令mkdir指令rmdir指令 && rm 指令man指令cp指令mv指令less指令find指令tar指令 二、关于Linux中的权限文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法文件访问权限的相关设…

老旧前端项目如何升级工程化的项目

因为历史的原因存在着大量的老旧前端项目,而在今天的开发环境中已经不再适应了,于是产生了升级到新的环境的需求。比如笔者当前的一个登录页面项目,就是以下面为技术栈的老旧项目。 基于 jQuery包管理基于 require.js,甚至有的没…