Spring:Spring事务失效的各种场景以及解决方法

一、前言

  Spring事务是指Spring框架中提供的事务管理功能,它可以帮助开发者简化事务管理的复杂性,提高代码的可维护性和可扩展性。本文将总结并分析Spring事务失效的各种场景,帮助你全面了解事务失效的原因和解决方案。

二、Spring事务失效的各种场景

1. 场景一:方法非public
代码展示:

@Service  
public class MyService {  @Transactional  void nonPublicMethod() {  // ... 业务逻辑  }  
}

原因分析:
  Spring AOP默认只对public方法进行拦截处理,因此非public方法上的@Transactional注解将不会被识别。

解决方案:
①. 将方法改为public。

②.让Spring支持非public方法


@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionAttributeSource transactionAttributeSource() {// 设置为false,这样protected及默认修饰的方法都将支持事务功能return new AnnotationTransactionAttributeSource(false) ;
}
开启Bean生效
GenericApplicationContext context = new GenericApplicationContext();
// 允许Bean覆盖,后面的BeanDefintion能覆盖前面的
// 我们定义的transactionAttributeSource bena能够覆盖系统默认的
context.setAllowBeanDefinitionOverriding(true) 

2.场景二:同一类中方法互相调用问题
代码展示:

@Service  
public class MyService {  @Transactional  public void outerMethod() {  innerMethod();  }  public void innerMethod() {  // ... 业务逻辑  }  // 假设在某个地方调用了outerMethod  
}

原因分析:
  在outerMethod中直接调用innerMethod属于自调用,不会通过代理,因此innerMethod的事务不会生效。

解决方案:
①.将innerMethod也加上@Transactional注解,
②.通过AopContext.currentProxy()获取代理对象进行调用。但通常不建议这么做,应重新设计代码结构。

 // 通过AopContext获取当前代理对象MyService proxy = (MyService )AopContext.currentProxy() ;proxy.innerMethod() ;

3.场景三:异常处理不当
代码展示:

@Service  
public class MyService {  @Transactional  public void myMethod() {  try {  // ... 业务逻辑,抛出Checked Exception  } catch (Exception e) {  // 处理异常,但没有重新抛出  }  }  
}

原因分析:
  默认情况下,Spring只会对运行时异常(RuntimeException)和Error进行事务回滚。如果捕获了异常并且没有重新抛出,那么事务管理器将不会知道异常的发生,因此不会触发回滚。

解决方案:
  确保在事务方法内部,所有需要触发回滚的异常都被抛出到方法外部,或者通过@Transactional的rollbackFor属性指定需要回滚的异常类型。

增加处理类型
@Transactional(rollbackFor = Exception.class)抛出异常
} catch (Exception e) {e.printStackTrace() ;throw new Exception(e) ;}

4.场景四:数据源或事务管理器配置错误
代码展示:

@Configuration  
@EnableTransactionManagement  
public class DataSourceConfig {  // ... 数据源和事务管理器配置,可能存在错误  
}

原因分析:
  数据源或事务管理器配置错误,如数据源URL、用户名、密码错误,或者事务管理器与数据源未正确关联等。

解决方案:
  检查并修正数据源和事务管理器的配置。

5.场景五:传播类型设置错误
原因分析:
  以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。如果错误地设置为需要事务的传播类型,但你的方法实际上不应该在事务中运行,可能会导致性能问题或不必要的资源消耗。

代码展示:


@Service  
public class MyService {  @Transactional(propagation = Propagation.NOT_SUPPORTED)  public void myMethod() {  // ...  }  
}

解决方案:
  修改事务传播类型。

6.场景六:异步线程执行
原因分析:
  在一个事务方法中开启新的线程执行事务方法,因为主线程与子线程使用的不是同一个Connection对象,Spring事务执行会为每一个执行线程绑定一个Connection对象。

代码展示:

@Service  
public class MyService {  @Async  @Transactional  public void asyncMethod() {  // ...  }  
}

解决方案:
①.使用PROPAGATION_REQUIRES_NEW来确保在新的线程中开始一个新的事务,但是,请注意,这并不意味着这个新事务会与原始线程中的事务有任何关联。

②.手动管理事务,使用PlatformTransactionManager来手动管理事务

③.分布式事务

  总结:在本文中,深入探讨了Spring事务失效的各种情况。通过了解这些情况,我们可以更好地理解事务管理在Spring框架中的重要性,以及如何避免和解决事务失效的问题。

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

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

相关文章

51汇编--数码管显示

;将内部RAM30H~32H单元中存储的6位十进制数显示在6个数码管上。 ;要求编写将一个内存单元中的压缩BCD码转换为两个七段显示码的子程序和 ;延时子程序。不允许在程序中给30H、31H和32H单元赋值,要通过存 ;储器窗口赋值。尝试改变点亮数码管的时间&#xf…

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法: ln -s test1.txt test2.txt 其中ln 是link(链接),-s 是soft(软),后者链接前者。 此时打开test2.txt,发现其中内容与test.txt一致。那么软连接到底建立了什么联系?…

轻松购物,尽在购物网

在忙碌的生活中,想要找到心仪的商品,却总是苦于没有时间和精力去实体店挑选?别担心,购物网为您提供一站式的购物体验。无论是时尚服饰、家居用品,还是美食特产,这里都能满足您的需求。只需轻轻一点&#xf…

监听element-ui表格滚动事件

当element-ui表格高度写死之后,表格内容超出高度就会在右侧显示滚动条,监听滚动事件 首先给表格加ref,ref"refTable" 然后在mounted生命周期里写监听事件 mounted() {this.$refs.refTable.$el.onwheel (e) > {console.log(滚…

深入解析线程上下文切换的原理与优化策略

深入解析线程上下文切换的原理与优化策略 定义触发条件线程上下文切换的过程线程上下文切换的开销减少上下文切换的方法示例代码总结 线程上下文切换(Thread Context Switch)是操作系统调度机制的重要组成部分。它涉及保存当前线程的状态并恢复新线程的状…

vue中使用ant的rangePicker设置禁选时间和时间格式

<a-range-pickerstyle"width: 100%":disabled-date"disabledDate"v-model:value"time"valueFormat"YYYY-MM-DD" />valueFormat设置时间格式YYYY-MM-DD 通过dayjs获取时间&#xff0c;return过滤后的时间 const disabledDate (…

安装apex时遇到的问题

Apex是混合精度库&#xff0c;安装过程中常常出现各种问题&#xff0c;在此记录一下 首先&#xff0c;不能使用pip install apex,这是两个完全不同的库&#xff0c;需要去官网下载 其次&#xff0c;参考官网安装时可能会报错&#xff1a;could not build wheels for apex, whic…

C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录 1、概述 2、不同版本的Visual Studio对应的运行时库说明 3、在Windbg10.0安装目录中获取UCRT通用运行时库 4、微软官网对UCRT通用运行时库的相关说明 5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题 6、如何查看软件依赖了哪些C/C运行时库&#…

后端雪花算法主键ID传到前端变了

Mybatis Plus 的主键策略&#xff1a; /*** id*/TableId(type IdType.ASSIGN_ID)private Long id; 这个主键策略会用雪花算法生成一个 19位的ID&#xff0c;比如 1791006670084734978 现象 后端生成的 id 是正常的&#xff0c;通过 swagger 文档此时获取到的 id 也和数据库中…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始&#xff0c;内循环从height.size()-1开始去计算每一个值是可以的&#xff0c;但是因为数据量太大&#xff0c;会超时。 2.考虑到超时&#xff0c;需要优化一些&#xff0c;比如第一个选下标1&#xff0c;第二个选下标3和第一个选下…

Java 面试题日常练习

### 基础知识 1. **什么是 JVM&#xff1f;解释其架构。** - JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序的运行时环境。其架构包括类加载器子系统、运行时数据区&#xff08;堆、栈、本地方法栈、PC 寄存器、方法区&#xff09;、执行引擎和本地方法接口…

心识宇宙 x TapData:如何加速落地实时数仓,助力 AI 企业智慧决策

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

基于springboot实现华府便利店信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现华府便利店信息管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本华府便利店信息管理系统就是在这样的大环境下诞生&#xff…

电影《朝云暮雨》观后感

上周看了电影《朝云暮雨》&#xff0c;看完之后&#xff0c;感觉自己整个人都不太好了&#xff0c;也不是说电影太差&#xff0c;只是觉得电影没有传达正能量&#xff0c;让人很不舒服。 &#xff08;1&#xff09;演技在线 对于著名的演员“范伟”&#xff0c;或者说&#x…

Payload SDK dji

开发硬件 感谢您的耐心等待&#xff0c;建议您可以考虑下树莓派4B或Jetson Nano开发板&#xff0c;看您需求选择&#xff0c;OSDK即将停止服务&#xff0c;我们建议您使用PSDK来进行开发&#xff0c;PSDK包含了OSDK的功能。Payload SDK 感谢您对大疆产品的支持&#xff01;祝…

【耕地保卫战:揭秘“占补平衡”】守护粮仓的智慧策略

嗨&#xff0c;各位小伙伴们&#xff0c;今天咱们来聊聊一个与我们每日餐桌紧密相关的主题——耕地占补平衡。在现代化的车轮滚滚向前时&#xff0c;如何在发展与保护之间找到那个微妙的平衡点&#xff0c;确保我们的“米袋子”满满当当呢&#xff1f;这就不得不提到耕地占补平…

SpringSession原理简析

本文借鉴于&#xff1a;Spring-Session 原理简析 - 知乎 (zhihu.com) 目录 概述 使用方式 原理 总结 概述 Session的原理 Session是存在服务器的一种用来存放用户数据的类哈希表结构&#xff0c;当浏览器第一次发送请求的时候服务器会生成一个hashtable和一个sessionid&…

论文阅读--Language-driven Semantic Segmentation

效果很好&#xff0c;文本增加一个词&#xff0c;就能找到对应的分割地方&#xff0c;给出的无用标签也不会去错误分割&#xff0c;而且能理解文本意思&#xff0c;例如dog和pet都能把狗给分割出来 image encoder使用DPT分割模型&#xff0c;大致架构为ViTdecoder&#xff0c;d…

【个人经历分享】末流本科地信,毕业转码经验

本人24届末流本科&#xff0c;地理信息科学专业。 我们这个专业可以说是 “高不成&#xff0c;低不就”的专业&#xff0c;什么都学但都不精。考研我实在是卷不动同学历的人&#xff0c;我在大三的时候就开始考虑转码。 至于我为什么选择转码&#xff0c;选择了GIS开发&#xf…

element ui 下拉框Select 选择器 上下箭头旋转方向样式错乱——>优化方案

目录 前言1、问题复现2、预期效果3、input框样式修改解析4、修改方案 &#x1f680;写在最后 前言 测试A&#xff1a;那啥&#xff01;抠图仔&#xff0c;样式怎么点着点着就出问题了。 前端&#xff1a;啥&#xff1f;css样式错乱了&#xff1f;你是不是有缓存啊&#xff01…