Spring事务失效的几种情况
Spring事务失效的几种情况
1、未被Spring管理的类中的方法
这种情况是指:没有在类上添加
@Service、@Repository、@Component等注解将类交由Spring管理,然后该类中还有加上了@Transactional注解
例如:
@Service //如果没有添加@Service这个注解,就是一种失效的情况
public class MyService {@Transactionalpublic void myTransactionalMethod() {// 事务管理的代码}
}
2、未正确配置事务管理器
在Spring Boot中,通常会自动配置事务管理器。然而,如果你手动配置了数据源或事务管理器,并且配置不正确,事务可能会失效。确保你的DataSource和PlatformTransactionManager配置正确
这里是它的一些错误情况
数据源配置错误: 确保数据源的驱动类、连接URL、用户名和密码等配置是正确的。
事务管理器配置错误: 确保事务管理器的配置正确,并且它引用了正确的实体管理器工厂。
实体管理器工厂配置错误: 确保实体管理器工厂的配置正确,包括数据源的引用、实体类的扫描路径等。
未加入适当的数据库依赖: 确保项目的依赖中包含了正确的数据库驱动依赖。
3、异常被捕获而不重新抛出
Spring事务默认只对未捕获的运行时异常进行回滚。如果在事务内捕获了异常并没有重新抛出,事务可能不会回滚。
看如下的代码,这个哪里有问题呢?我们该如何来修改它
@Transactional
public void myTransactionalMethod() {try {// 可能会抛出异常的代码// ...} catch (Exception e) {// 异常被捕获,但没有重新抛出// 可能导致事务不回滚log.error("An error occurred: {}", e.getMessage());}
}
在上述代码中,如果在
try块中的代码抛出了异常,但在catch块中没有重新抛出该异常,那么事务可能不会回滚。因为Spring默认只回滚未捕获的运行时异常。为了确保事务能够正常回滚,应该在catch块中将异常重新抛出或采取其他适当的措施。下面是它修改之后的代码:
@Transactional
public void myTransactionalMethod() {try {// 可能会抛出异常的代码// ...} catch (Exception e) {// 将异常重新抛出throw e;}
}
4、自调用问题
这个就是一般最容易出现的问题了(个人感觉)
就是在同一个类中,直接调用了另一个加上了@Transactional注解的方法,使Spring可能无法截获这个调用(因为调用并没有经过代理对象),所以事务失效了。
就是下面例子这种情况:
@Service
public class MyService {@Transactionalpublic void methodA() {// 一些数据库操作}public void methodB() {// 一些逻辑操作methodA(); // 在同一个类中直接调用methodA}
}
在这个例子中,
methodB在同一个类中直接调用了methodA。Spring的AOP代理没有介入,即没有生成代理对象,所以methodA可能就受不到@Transactional注解的影响。
那如何来解决这种情况呢?
解决方法:
1、使用代理对象调用方法A(通过GPT了解的)
2、使用
AopContext.currentProxy()获取当前代理对象(黑马视频中学的)
方法一: 使用代理对象调用方法A
@Service
public class MyService {@Autowiredprivate MyService self; // 自动注入当前类的实例@Transactionalpublic void methodB() {// 通过代理对象调用methodAself.methodA();}public void methodA() {// 一些数据库操作}
}
方法二:使用AopContext.currentProxy()获取当前代理对象
//使用前提:需要在SpringBoot启动类上加上@EnableAspectJAutoProxy(exposeProxy = true)
//该注解目的是:暴露代理对象,如果没有暴露,我们是拿不到代理对象的
@Service
public class MyService {@Transactionalpublic void methodB() {// 获取当前代理对象MyService proxy = (MyService) AopContext.currentProxy();// 通过代理对象调用methodAproxy.methodA();}public void methodA() {// 一些数据库操作}
}
更多了解:
百度安全验证
https://www.cnblogs.com/xiaowangbangzhu/p/17143288.html
相关文章:
Spring事务失效的几种情况
Spring事务失效的几种情况 1、未被Spring管理的类中的方法 这种情况是指:没有在类上添加Service、Repository、Component等注解将类交由Spring管理,然后该类中还有加上了Transactional注解 例如: Service //如果没有添加Service这个注解…...
filter的用法与使用场景:筛选数据
//this.allCollectorList:后台给定的所有可供选择数据 //this.collectorData:目前已经存在选中列表中的数据//目前已经存在选中列表中的数据id getSelIdList() {let eIdList = []this.collectorData.forEach(row => {eIdList.push(row.id)})return eIdList },//在中的数据…...
ClickHouse(18)ClickHouse集成ODBC表引擎详细解析
文章目录 创建表用法示例资料分享参考文章 ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库. 为了安全地实现 ODBC 连接,ClickHouse 使用了一个独立程序 clickhouse-odbc-bridge. 如果ODBC驱动程序是直接从 clickhouse-server中加载的,那…...
网络攻击(一)--安全渗透简介
1. 安全渗透概述 目标 了解渗透测试的基本概念了解渗透测试从业人员的注意事项 1.1. 写在前面的话 在了解渗透测试之前,我们先看看,信息安全相关的法律是怎么样的 中华人民共和国网络安全法 《中华人民共和国网络安全法》由全国人民代表大会常务委员会…...
视频号小店资金需要多少?
我是电商珠珠 视频号团队于22年7月发展了自己的电商平台-视频号小店,相比于抖音电商来讲,可以有效的将公域流量转化为私域,对于商家来说,是一件利好的事情。 可以有效的提高客户的黏性,增加店铺回头客。 有很多想要…...
机器学习项目精选 第一期:超完整数据科学资料合集
大噶吼,不说废话,分享一波我最近看过并觉得非常硬核的资源,包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址:https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…...
档案数字化管理可以提供什么服务?
档案数字化管理提供了便捷、高效和安全的档案管理服务,帮助组织更好地管理和利用自己的档案资源。 具体来说,专久智能档案数字化管理可以提供以下服务: 1. 档案扫描和数字化:将纸质档案通过扫描仪转换为数字格式,包括文…...
第一周:AI产品经理跳槽准备工作
一、筛选意向行业 因素1:行业发展情况 1. 行业发展情况和政策 待补充 2. AI人才市场情况 报告下载:待补充 2023年2⽉,ChatGPT爆⽕在脉脉引发各界搜索和热议,当⽉,“AIGC”、“⼈⼯智能”、“ChatGPT”、“⼤模型”等相关词汇搜索指数达到459.31,同⽐增⻓超5.4倍,内…...
基于核心素养高中物理“深度学习”策略及其教学研究课题论证设计方案
目录 一、课题的提出及意义 二、课题的核心概念及其界定...
通过 Java 17、Spring Boot 3.2 构建 Web API 应用程序
本心、输入输出、结果 文章目录 通过 Java 17、Spring Boot 3.2 构建 Web API 应用程序前言Spring Boot 3.2 更新了哪些内容Java 17 新特性构建步骤花有重开日,人无再少年实践是检验真理的唯一标准通过 Java 17、Spring Boot 3.2 构建 Web API 应用程序 编辑:简简单单 Online…...
go原生http开发简易blog(一)项目简介与搭建
文章目录 一、项目简介二、项目搭建前置知识三、首页- - -前端文件与后端结构体定义四、配置文件加载五、构造假数据- - -显示首页内容 代码地址:https://gitee.com/lymgoforIT/goblog 一、项目简介 使用Go原生http开发一个简易的博客系统,包含一下功能…...
[足式机器人]Part4 南科大高等机器人控制课 Ch09 Dynamics of Open Chains
本文仅供学习使用 本文参考: B站:CLEAR_LAB 笔者带更新-运动学 课程主讲教师: Prof. Wei Zhang 南科大高等机器人控制课 Ch09 Dynamics of Open Chains 1. Introduction1.1 From Single Rigid Body to Open Chains1.2 Preview of Open-Chain …...
概率论复习
第一章:随机概率及其概率 A和B相容就是 AB 空集 全概率公式与贝叶斯公式: 伯努利求概率: 第二章:一维随机变量及其分布: 离散型随机变量求分布律: 利用常规离散性分布求概率: 连续性随机变量…...
ES客户端RestHighLevelClient的使用
1 RestHighLevelClient介绍 默认情况下,ElasticSearch使用两个端口来监听外部TCP流量。 9200端口:用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控、以及其他任何使用HTTP协议的请求。所有的客户端库都会使用该端口与ElasticSearch进行交互。…...
GitHub入门命令介绍
GitHub是当今最受欢迎的代码托管平台之一,它提供了强大的版本控制和协作功能。 对于初学者来说,熟悉GitHub的基本命令非常重要。下面介绍一些常用的GitHub命令。 一、安装Git 1. Windows系统:在Windows上使用GitHub之前,您需要先…...
EasyExcel 简单导入
前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点:springboot、easyExcel、桥接模式; 说明:本次使用实体类student:属性看前边章节内容; 1、公共导入service public …...
Termux搭建nodejs环境
安装nodejs ~ $ pkg install nodejs使用http-server搭建文件下载服务 先安 http-server 并启动 # 安装 http-server 包 ~ $ npm install -g http-server# 启动 http-server 服务 ~ $ http-server Starting up http-server, serving ./http-server version: 14.1.1http-serve…...
喜报丨迪捷软件入选2023年浙江省信息技术应用创新典型案例
12月6日,浙江省经信厅公示了2023年浙江省信息技术应用创新典型案例入围名单。本次案例征集活动,由浙江省经信厅、省密码管理局、工业和信息化部网络安全产业发展中心联合组织开展,共遴选出24个优秀典型解决方案,迪捷软件“基于全数…...
C语言连接zookeeper客户端(不能完全参考官网教程)
准备过程 1.通过VStudio 远程连接linux的开发环境; 2.g环境,通过MingW安装; 3.必须要安装好pthread.h的环境,不管是windows端(linux 可视化端开发就不管这个)还是linux端; 4.需要准备zookeeper…...
python排序
0. 背景 Python排序功能十分强大,可以进行基本排序或自定义排序。Python中提供两种不同的排序方法对各种各样的数据类型进行排序。 1. 使用sorted()函数排序 排序主要是对相同数据类型的元素进行的,包括数值和字符串两种数据类型。 1.1 对数值进行排…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
