同一个Service类中非事务方法 调用 事务方法,事务失效 解决方法

news2025/3/12 13:16:21

同一个Service类中非事务方法 调用 事务方法,事务失效 解决方法

在平时开发中,同一个Service类中非事务方法调用事务方法,事务会失效,这里简单解释一下原因:

spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!可以理解为同一个类中非事务方法调用方法时用的是当前对象去调用,而不是spring生成的代理对象,所以会导致事务失效。

问题场景:

controller调用方法A,方法A调用 方法B1、方法B2、、、,,(方法A、B1、B2、、在同一个service中),,,在执行的过程中,,,希望的是方法B1、B2、B3里面,抛异常了就回滚,不抛异常就正常运行,,,而最外层的方法A是正常运行的

A方法:
在这里插入图片描述
B1 、B2方法
在这里插入图片描述
调用结果:
在这里插入图片描述

解决方法:

方法1.将需要进行事务管理的方法单独写到一个Service文件中

	@Servcie
	public class ServiceA {
	  @Autowired
	  private ServiceB serviceB;
	  
	  public void save(User user) {
	        queryData1();
	        queryData2();

		     //调用事务方法
	        serviceB.doSave(user);
	  }
	}
    
    -------------------------分界线----------------------------------------
    
	//新加的 @Servcie
	@Servcie
	public class ServiceB {
	   
	   //事务方法
	   @Transactional(rollbackFor=Exception.class)
	   public void doSave(User user) {
	      addData1();
	      updateData2();
	   }
	}

方法2.在该Service类中注入自己,使用注入的自己进行调用事务方法

  @Servcie
  public class ServiceA {
     
     //注入自己
     @Autowired
     private ServiceA serviceA;
     
     public void save(User user) {
           queryData1();
           queryData2();
           //this.doSave(user);
           
           //使用注入的自己 调用事务方法
           serviceA.doSave(user);
     }
     
     @Transactional(rollbackFor=Exception.class)
     public void doSave(User user) {
         addData1();
         updateData2();
      }
   }

可能有些人可能会有这样的疑问:这种做法会不会出现循环依赖问题?
其实spring ioc内部的三级缓存保证了它,不会出现循环依赖问题

方法3.使用 AopContext.currentProxy() 获取代理对象

1)增加maven依赖:
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>2)springboot启动类加上注解:@EnableAspectJAutoProxy(exposeProxy = true)3Service类中,获取代理对象后,再去调用事务方法
CommServiceImpl currentProxy = (CommServiceImpl) AopContext.currentProxy()

在这里插入图片描述

相关知识点:

@Transactional修饰的方法的特点: public方法,且事务内尽可能简单:

Spring事务是通过AOPQ实施事务增强的。由于接口的方法是public的,这句要求实现类的实现方法必须是public 的 (不能是protect,private等),同时不能使用static的修饰符。即只有public的方法才可以被aop增强。

处理过程尽量的简单。尤其是带锁的事务方法,能不放在事务里面的最好不要放在事务里面。可以将常规的数据库查询操作放在事务前面进行,而事务内进行增、删、改、加锁查询等操作。

@事务中代码异常抛出之后导致事务并无回滚的几种情况:

1.@事务性应用在非公开修饰的方法上。

2.同一个类中方法调用,导致@Transactional失效。比如有一个类Test,它的一个方法A,A再调用本类的方法B (不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的

3.异常被你的catch吃掉 导致@事务性失效

4…

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

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

相关文章

开发小程序流程

小程序的诞生&#xff0c;是继微信公众号之后的又一款火爆的 APP&#xff0c;并且小程序的市场需求也是非常大的。在小程序出现后&#xff0c;很多商家都想开发自己的小程序&#xff0c;但是因为不知道怎么开发&#xff0c;所以对此感到迷茫。下面就由爱尚网络科技来为大家介绍…

成功上岸奇安信!这份零基础入门网络安全的学习路线你一定要看,学长带你网络安全从入门到就业!

作为一个实用型技术博主&#xff0c;​由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人在后台问我&#xff1a; 现在转行学网络安全是一个正确的选择吗&#xff1f;我刚入门网络安全&#xff0c;该…

如何在华为OD机试中获得满分?Java实现【取出尽量少的球】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 某部门开展 Family Day …

震惊!吊打面试官,必备的 SpringCloud 微服务面试题(VIP典藏版)

目录 福利&#xff1a;文末有分享SpringBoot教程及源码哦《【imooc-java2021】体系课-Java工程师 》 Spring Cloud微服务面试题 1、Spring Cloud Netflix和Spring Cloud Alibaba包括哪些组件 2、Nacos是CP还是AP? 3、Nacos作为注册中心应该选择是CP还是AP&#xff1f; 4、…

ImageBind与Stable diffusion使用记录

参考代码 ImageBind&#xff1a;GitHub - facebookresearch/ImageBind: ImageBind One Embedding Space to Bind Them All ImageBind stable-diffusion-2-1-unclip&#xff1a;GitHub - Zeqiang-Lai/Anything2Image: Generate image from anything with ImageBind and Stabl…

条码控件Aspose Barcode,满足您条码需求的终极解决方案

Aspose.BarCode for .NET 是一个功能强大的API&#xff0c;可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能&#xff0c;以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API 支持流行文件格式处理&a…

一文了解国内外电子后视镜(CMS)现行法规标准

摘要&#xff1a; 本文小编分享一篇整合了国内外对CMS的安装及功能性做出要求的相关标准与法规。感兴趣的朋友可以专门去搜索学习。 前言&#xff1a;随着GB15084-2022的即将正式实施&#xff0c;以摄像头屏幕组合取代传统光学后视镜的新一代电子后视镜CMS相关车型将被允许上路…

如何卸载Visio秘钥

文章目录 如何卸载Visio秘钥解决的问题我的环境版本查找OSPP.VBS文件使用命令行查看信息卸载Visio秘钥卸载其他版本秘钥查看word激活卸载Office秘钥总结 如何卸载Visio秘钥 解决的问题 本文教你如何卸载Visio或Office秘钥&#xff0c;如果安装了多个Visio无效秘钥&#xff0c…

【SpringBoot教程】开发提效工具Lombok引入 Mybatis-plus-generator代码自动生成工具

⛪ 专栏地址 系列教程更新中 &#x1f680; 文章介绍: 在开发过程中免不了与数据库的交互&#xff0c;其中模板类的编写如果手动编写会耗费大量时间&#xff0c;这里可引入MybatisPlus的Mybatis-plus-generator进行代码模板映射生成提高开发效率 &#x1f680; 源码获取: 项目中…

STM32 Cubemx Freertos 工程, 用GDB进行debug时候, 跳进HardFault_Handler的问题

现象: 正常运行没问题, 但是一旦用gdb来debug, 开场很快就进hardfault 分析: 进了hardfault时候观察调用栈 竟然是从定时器中断过来的 也就是定时器中断执行这条时候 再往前推, 是初始化systick时候 也就是说, 前一行把中断打开, 这一行打开定时器时钟, 马上进了一次中断…

淘宝图片搜索接口API封装

本篇博文介绍了对淘宝图片搜索API的二次封装&#xff0c;将URL参数封装成Python函数&#xff0c;直接传入参数即可获取搜索结果&#xff0c;例如淘宝商品标题、价格、销量和URL等。提供了详细的代码示例和接口调用Demo。 taobao.item_search_img-按图搜索淘宝商品&#xff08;拍…

hive 架构及 metastore 功能简单介绍

这两天在调研用 java 怎么能通过 hive metastore 将 hive 表中的数据读出来&#xff08;不能用 hive2&#xff09;&#xff0c;最好是能直接支持 sql 查询。各种查跟尝试&#xff0c;最终确定这条路走不通。期间研究了下 hive 的内部架构&#xff0c;其实就是看了一遍官方文档。…

企业微信也能接入ChatGPT啦~你也能成功,步骤超详细~

文章目录 配置企业微信创建企业创建应用 配置项目一、OpenAI账号注册二、克隆项目代码三、复制配置文件四、企业微信配置 服务器购买运行项目安装Python安装核心依赖启动项目 个人微信绑定 上次我把ChatGPT接入了微信&#xff08;请看这篇文章当ChatGpt接入微信群之后&#xff…

【王道·操作系统】第二章 进程管理【未完】

一、进程的基本概念 1.1 进程的概念 程序&#xff1a;静态的&#xff0c;存放在磁盘里的可执行文件&#xff0c;是一系列的指令集合进程Process&#xff1a;动态的&#xff0c;是程序的一次执行过程 1.2 进程的组成 数据结构PCB(process control block)&#xff0c;即进程控…

再谈sqlserver事务

事务没提交时&#xff0c;自增字段的数据已经生成 id 3&#xff0c; 此时 脏读数据 select with&#xff08;nolock&#xff09; 你获取的id是3 如果 rollback后 我重新提交插入数据&#xff0c;id3 的数据没了&#xff0c;变成了 4 因此&#xff0c;nolock允许脏的语句…

如何在华为OD机试中获得满分?Java实现【查找重复代码】一文详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 小陈负责维护项目中的代…

电子劳动合同如何签订才能生效呢?四步就能教会你!

根据人力资源社会保障部发布的《电子劳动合同订立指引》规定&#xff1a;用人单位与劳动者订立电子劳动合同的&#xff0c;要通过电子劳动合同订立平台订立。 电子劳动合同订立平台要通过有效的现代信息技术手段提供劳动合同订立、调取、储存、应用等服务&#xff0c;具备身份…

前端正确处理“文字溢出”的思路

目录 前言 一. 组件效果预览 二. 单行溢出的处理 三. 前期准备 四. 理清思路 五. 完成 autoEllipsis 函数 六. 保留后缀的实现 七. 源码 八. 优化点 前言 最近在项目中需要做到类似于 Mac 下这种&#xff0c;当屏幕宽度足以容下当前文件名称的时候&#xff0c;文件名称…

小心!认证中的这几个坑别再踩了

【小心&#xff01;认证中的这几个坑别再踩了】 1.三天拿证不可信&#xff01; 想要今天办理、明天拿证是不可能实现的。一个认证需要经过前期的材料准备、现场审核、提交报告、颁发证书这一整套流程&#xff0c;拿FSC认证来说&#xff0c;就算所有环节都顺利完成&#xff0c;也…

网络安全入门学习路线,CSDN最全!建议收藏!

前言 网络安全行业热度越来越高&#xff0c;我也因此对这个领域充满了好奇。但是我也是一个完全的门外汉&#xff0c;从零开始学习网络安全有多难&#xff1f;下面是我的经验总结。 第一阶段&#xff1a;入门 我的第一步是寻找网络安全的入门书。推荐《黑客攻防技术宝典&…