同一个 Bean 内部的方法中,方法之间调用的事务控制未生效,排查原因及解决方案

JeecgBoot数据库密码重置实战:绕过前端加密直接修改用户密码 在系统运维与后台管理中,用户密码的安全存储与验证是核心安全机制。现代应用普遍采用加盐哈希(如MD5加盐或BCrypt)对密码进行加密存储,其原理是将用户密码与一个随机生成的盐值(Salt)组合后,通过单向散列函数生成不可逆的密文,以此抵御彩虹表等攻击,提升安全性。这项技术的工程价值在于,即使数据库泄露,攻击者也难以逆向破解原始密码。在实际的运维场景,如紧急账号恢复、数据迁移或后台管理功能缺失时,管理员可能需要绕过标准流程,直接在数据库层面完成密码重置。这要求运维人员必须精确理解系统的加密逻辑,通过逆向分析代 阅读详情

先上错误示例:

@Service
public class MyService {


    public void mainMethod() {
        // 主方法逻辑
        doMainBusiness();
        
        try {
            doSubBusiness();
            return true;
        } catch (Exception e) {
            log.error("子事务失败", e);
            return false;
        }
        
        // 主方法继续执行
    }

    private void doMainBusiness() {
        // 主方法的数据库操作
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void doSubBusiness() {
        // 子方法的数据库操作
    }
}

代码中,子方法 doSubBusiness 的数据库操作不会回滚。这是因为 Spring AOP 的代理机制无法拦截同一个 Bean 内的私有方法调用,导致 @Transactional 注解失效。

详细原因分析

  1. Spring AOP 代理机制
    Spring 的事务管理基于 AOP 代理,而 同一个 Bean 内部的方法调用不会触发代理。当 mainMethod() 调用 doSubBusiness() 时,实际上是通过 this 引用调用,绕过了 Spring 的事务代理。因此:

    • @Transactional 注解虽然在 public 方法上有效,但在同一 Bean 内部调用时不会生效。
    • 子方法的数据库操作会在主事务(如果存在)中执行,或默认不使用事务。
  2. 事务传播行为失效
    由于代理未生效,Propagation.REQUIRES_NEW 无法创建独立事务。若主方法没有事务,子方法的操作会直接提交到数据库;若主方法有事务,子方法会加入该事务

解决方案

方案 1:将子方法提取到独立 Service
@Service
public class MainService {
    @Autowired
    private SubService subService;

    public void mainMethod() {
        try {
            subService.doSubBusiness(); // 通过代理调用,事务生效
        } catch (Exception e) {
            log.error("子方法失败", e);
        }
    }
}

@Service
public class SubService {
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void doSubBusiness() {
        // 数据库操作
    }
}
方案 2:通过 ApplicationContext 获取代理对象
@Service
public class MyService {
    @Autowired
    private ApplicationContext context;
    private MyService selfProxy;

    @PostConstruct
    public void init() {
        selfProxy = context.getBean(MyService.class);
    }

    public void mainMethod() {
        try {
            selfProxy.doSubBusiness(); // 通过代理调用,事务生效
        } catch (Exception e) {
            log.error("子方法失败", e);
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void doSubBusiness() {
        // 数据库操作
    }
}
方案 3:使用 TransactionTemplate 手动管理事务
@Service
public class MyService {
    @Autowired
    private TransactionTemplate transactionTemplate;

    public void mainMethod() {
        Boolean result = transactionTemplate.execute(status -> {
            try {
                doSubBusiness();
                return true;
            } catch (Exception e) {
                status.setRollbackOnly(); // 手动回滚
                log.error("子事务失败", e);
                return false;
            }
        });
    }

    private void doSubBusiness() {
        // 数据库操作
    }
}

总结

代码中,由于 Spring AOP 无法拦截同一 Bean 内的方法调用,@Transactional 注解失效,子方法的数据库操作不会回滚。建议采用方案 1 或方案 3 解决此问题。

基于SpringBoot+MyBatis-Plus的物资管理系统开发实战 在Web应用开发领域,Java企业级框架因其稳定性和成熟的生态被广泛应用于各类业务系统。SpringBoot作为Spring框架的“脚手架”,通过自动配置和起步依赖,极大地简化了项目的初始搭建和部署流程,让开发者能快速构建独立、生产级的应用程序。其核心价值在于提升开发效率、降低配置复杂度,并保持高度的可扩展性。结合MyBatis-Plus这一强大的数据持久层增强工具,可以进一步简化数据库操作,通过通用Mapper和Service实现单表CRUD的零SQL编写,显著提升数据访问层的开发效率。这种技术组合特别适 阅读详情

相关推荐

3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)

3.1 计算机视觉的发展和卷积神经网络(百度架构师手把手带你零基础实践深度学习原版笔记系列) 概要 计算机视觉作为一门让机器学会如何去“看”的科学学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场景和故事,以此来模拟人脑视觉系统。因此,计算机视觉也通常被叫做机器视觉,其目的是建立能够从图像或者视频中“感知”信息的人工系统。 计算机视觉技术经过几十年的发展,已经在交通(车牌识别、道路违章抓拍)、安防(人脸闸机.

aiAI 691

Hibernate SessionFactory 核心原理与生产级配置指南

SessionFactory 是 Hibernate 运行时的元数据中枢,承载映射定义、SQL 方言编译、二级缓存注册与连接适配等关键能力。其本质并非简单对象工厂,而是不可变、线程安全的运行时真相源——所有 Session 均为其影子副本。正确理解 getCurrentSession 与 openSession 的生命周期契约,是规避懒加载异常、连接泄漏和事务不一致的前提;而 openStatelessSession 则代表极致轻量的数据搬运范式。在高并发、微服务与批处理场景下,SessionFactory

weixin_34290631的博客 441

java实现自动发送微信QQ消息(可发图片)

自动发送微信/QQ/微博等消息 一:功能:实现发送QQ/微信/微博消息,程序控制。 效果演示(实现自动发生QQ微信消息给女友,发微博信息也可以就不演示了) 二:原理讲解:将剪贴板的内容给发送到QQ微信中去,复制粘贴发送。 模拟真实操作进行发送信息。 三:前期准备,软件安装,及初步测试。...

XURUNFA950827的博客 1万+

Spring使用笔记知识点

Spring常见问题重新记录下

qq_51178489的博客 543

避坑指南:群晖DSM 7.X挂载NTFS硬盘,为什么你的SATA口不行?从原理到实战一次讲清

本文深入解析群晖DSM 7.X系统挂载NTFS硬盘的底层原理与实战排查方法,揭示SATA接口权限配置的关键参数(如esataportcfg和internalportcfg),并提供安全修改端口配置的详细步骤。针对不同型号群晖NAS的配置差异,给出替代方案与常见故障排查技巧,帮助用户解决NTFS硬盘挂载问题。

weixin_26757925的博客 256

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

SpringBoot 内部方法调用,事务不起作用的原因及解决办法

1.1 前言: 在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,在同一个类中,两个及以上带有事务的方法调用(例如;有方法A(),B(),在A()中调用B()),失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。 1.2 代码示例 /** * 内部调用新增方法 * * @param user */ @Override @Transactional(rollbackFor = Exception.class)

jothan的博客 1933

【问题解析】Matlab Function的易错点(Variable Size)

Matlab Function的易错点

CrazyRabbit的博客 9869

spring boot调用同一类内方法导致事务失效处理

我们要清楚,**异步,事务**这些注解生效的原理,在于通过切面创建了代理类,通过操作代理类我们实现了异步,事务,但是当我们在同一类内声明异步,事务时,则不会创建代理类,因此异步,事务注解失效。

一介码农 1778

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 306

SAP 经营范围(Operating Concern) 和业务范围 (Business Area) 在核算架构或是管理架构中的区别和联系分别是什么 请给具体的示例

摘要:SAP系统中,业务范围(Business Area)和经营范围(Operating Concern)在核算架构中具有不同功能。业务范围是FI/CO共用维度,用于跨公司码的业务线核算(如电子产品、机械设备),支持内部管理和简单对外报表。经营范围则是CO-PA专属维度,聚焦获利能力分析,可细化到产品+客户+区域组合(如分析手机在华东区域的获利情况)。两者存在层级关联:经营范围包含业务范围作为基础维度,业务范围数据会传递至经营范围进行深度分析。实际应用中需先配置业务范围,再设置经营范围并关联相关维度,共同支

金牌架构师 96

解决在同一个bean类里两个方法互相调用,事务失效的问题。

解决在同一个bean类里两个方法互相调用,事务失效的问题。 下面是解决方案: 1. 把方法B抽离到另外一个XXService中去,并且在这个Service中注入XXService,使用XXService调用方法B; 显然,这种方式一点也不优雅,且要产生很多冗余文件,看起来很烦,实际开发中也几乎没人这么做吧?.反正我不建议采用此方案; 2. 通过在方法内部获得当前类代理对象的方式,通过代理对象调用方法B 上面说了:动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了! 所以我们就使用

jsq6681993的博客 2539

【Halcon-1D测量】measure_pairs 函数功能(用于提取垂直于矩形/环形弧主轴的直边对)

HALCON算子measure_pairs是1D测量模块的基础工具,专用于提取垂直于矩形/环形弧主轴的直边对。该算子通过振幅阈值和灰度过渡规则(如positive/negative)进行边对分组,支持_strongest后缀选择最强边缘避免误配对。输出包含边缘坐标、振幅及内外间距(IntraDistance/InterDistance)。关键限制包括仅适用于直边、Sigma需≤0.5×测量长度,且忽略图像域。相比模糊版本算子,它更适用于边缘清晰的简单场景(如电子元件间距测量)。典型应用需配合gen_meas

weixin_45590420的博客 305

方法内部调用,事务不生效原因是什么,从原理和代码分析

方法内部调用导致事务不生效的根本原因是。

C18298182575的博客 917

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

为什么同一个 Bean 内部的方法调用会绕过spring的事务代理,导致不会触发代理事务未生效

Bean 内部的方法调用会绕过spring的事务代理

a59457asdf的博客 569

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java-26 深入浅出 Spring - 实现简易Ioc-02 无IoC与AOP场景下实现业务

本文围绕"无 IoC、无 AOP"的手写 Java 转账案例,演示 Spring 出现前典型的依赖组装与事务控制写法。案例基于 Druid(Alibaba 开源 JDBC 连接池,2023-10 发布 1.2.20 版本增强 Spring Boot 3 支持)、MySQL JDBC Driver(`com.mysql.cj.jdbc.Driver`)与 Servlet 4.0 API(`javax.servlet`,对应 Apache Tomcat 9.x;Tomcat 10+ 已迁移至 `jakarta.

谢谢你的喜欢 我们一起无限进步 9085

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入解析AOP核心概念与Spring实现机制

面向切面编程(AOP)是一种补充面向对象编程(OOP)的重要范式,通过代理模式实现横切关注点(如日志、事务、安全等)的模块化。其核心原理包括切入点(Pointcut)、增强(Advice)、切面(Aspect)等概念,采用动态代理技术在运行时织入功能。Spring AOP作为主流实现,默认使用JDK动态代理和CGLIB,支持声明式事务管理等典型应用场景。在分布式系统和微服务架构中,AOP与Spring生态深度整合,广泛应用于性能监控、链路追踪等关键领域,显著提升代码复用性和可维护性。

weixin_34417183的博客 355

Spring Boot + H5C3 汽车4S店管理系统:Java Web实战项目从零部署与核心功能测试

企业级Web应用开发通常采用B/S架构与MVC模式,以实现前后端分离和清晰的职责划分。Spring Boot作为Java领域主流的快速开发框架,通过自动配置和约定大于配置的原则,极大地简化了基于Spring应用的初始搭建和开发过程。其技术价值在于能够帮助开发者快速构建独立运行、生产级别的应用程序,特别适用于需要快速迭代和部署的业务系统。在汽车服务、客户关系管理(CRM)等实体行业的信息化场景中,此类管理系统能有效整合客户、车辆、维修保养及库存等核心业务流程。本文以汽车4S店管理系统这一典型实战项目为例,详细

weixin_30753873的博客 387

SpringBoot非遗购物系统:从零搭建企业级Java毕设项目实战

SpringBoot作为Java企业级开发的主流框架,通过自动配置和约定大于配置的理念,极大地简化了传统Spring应用的搭建和部署流程。其核心原理在于Starter依赖和自动装配机制,能够快速集成Web、数据访问、安全等模块,显著提升开发效率。这一技术价值在于为开发者提供了一个标准化的、可快速上手的项目骨架,尤其适用于电商、管理系统等典型应用场景。在实际工程实践中,结合MyBatis-Plus进行数据持久化操作,可以进一步简化CRUD代码编写;而集成Shiro或Spring Security则能有效管理系

weixin_30600197的博客 455

JDK17+Spring Boot3采购管理系统:从环境搭建到订单审核完整实战

采购管理系统是JavaWeb方向的典型业务场景,涉及供应商管理、订单创建与审核等核心流程。在技术选型上,JDK 17作为长期支持版本,配合Spring Boot 3框架,不仅满足未来生态兼容性,更通过Jakarta EE包名迁移带来更规范的开发体验。Spring Boot 3与MyBatis-Plus的版本匹配、数据库表设计、登录拦截器及事务控制,是保障订单数据完整与权限安全的关键。该技术组合广泛应用于毕业设计、企业进销存及微服务架构的入门实践,能有效提升开发效率与代码可维护性。本文围绕采购管理系统,完整梳

weixin_34320159的博客 633

spring同类调用事务不生效-原因及三种解决方式

spring提供的声明式事务注解@Transactional,极大的方便了开发者管理事务,无需手动编写开启、提交、回滚事务的代码。 但是也带来了一些隐患,如果注解使用不当,可能导致事务不生效,最终导致脏数据也入库。 如果在同一个类直接调用事务方法,就会导致事务不生效,示例如下 public class StudentServiceImpl implements StudentService { @Autowired private StudentMapper studentMa.

hellozhxy的博客 1万+

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 292

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 349

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 144
上一篇: 使用Java Optional和Stream安全处理集合元素
下一篇: 为什么同一个 Bean 内部的方法调用会绕过spring的事务代理,导致不会触发代理事务未生效
恒雨田
博客等级 码龄8年 263粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值