当前位置: 首页 > news >正文

事务相关问题

目录

1.在一个bean中,一个无事务的方法调用有事务的方法,事务失效

2.在一个事务中进行数据源的切换不生效

3.一个有事务的方法调用另一个有事务的方法,如果在第二个方法中出现异常,事务回滚,然后在第一个方法中,没有判断第二个方法的返回值,直接进行事务的提交,这时会报错,因为事务已经回滚了,不能进行提交


1.在一个bean中,一个无事务的方法调用有事务的方法,事务失效

原因是在一个类中调用,使用this调用,this指的是当前原始对象的实例,而非代理对象

解决方法:将要添加事务的方法写在其他bean中,方法上添加事务,然后注入进行进行调用

@Service
public class UserService {public void methodA() {// 无事务方法this.methodB();  // 直接调用,事务失效}@Transactionalpublic void methodB() {// 有事务方法// 事务失效原因:this指向原始对象,而不是代理对象// 解决方案:通过注入的代理对象调用}
}// 正确写法
@Service
public class UserService {@Autowiredprivate UserService self;  // 注入代理对象public void methodA() {self.methodB();  // 通过代理对象调用,事务生效}@Transactionalpublic void methodB() {// 有事务方法}
}

2.在一个事务中进行数据源的切换不生效

因为开启事务后是不能进行动态数据源的切换的

事务内是不支持进行数据源的切换的,一旦开启事务,这个事务只能对应一个数据源

解决方法:规划好方法的逻辑,不在事务内进行数据源的切换

@Service
public class UserService {@Autowiredprivate DataSource dataSource;@Transactionalpublic void method() {// 开启事务try {// 业务操作1// 尝试切换数据源DynamicDataSourceContextHolder.setDataSource("slave");// 此时切换数据源不会生效,因为事务已经开启// 事务会继续使用原来的数据源// 业务操作2} finally {DynamicDataSourceContextHolder.clear();}}
}// 正确写法:在事务方法之前切换数据源
@Service
public class UserService {@Autowiredprivate UserService self;public void method() {// 先切换数据源DynamicDataSourceContextHolder.setDataSource("slave");try {// 再开启事务self.transactionalMethod();} finally {DynamicDataSourceContextHolder.clear();}}@Transactionalpublic void transactionalMethod() {// 事务方法}
}

3.一个有事务的方法调用另一个有事务的方法,如果在第二个方法中出现异常,事务回滚,然后在第一个方法中,没有判断第二个方法的返回值,直接进行事务的提交,这时会报错,因为事务已经回滚了,不能进行提交

解决方法:可以在第二个方法中开启一个新事物,这样两个事务互补干扰

也可以在第二个方法中不添加事务,直接使用方法一的事务,如果方法二异常,则在方法一中进行判断,进行事务的操作

http://www.lqws.cn/news/531433.html

相关文章:

  • 数学:逆元,同余
  • 热点代码探测确定何时JIT
  • Codeforces Educational Round 180 题解
  • 【25软考网工】第十章 网络规划与设计(2)网络规划与分析、网络结构与功能
  • [按键手机安卓/IOS脚本插件开发] 按键插件调试与判断循环结构辅助工具
  • Jenkins执行Jenkinsfile报错
  • 可用的.gitignore文件
  • LDO的自放电功能
  • UE Universal Camera 相机插件-限制镜头在区域内移动
  • 认识Jacobian
  • 数学:初步了解什么是线性代数?
  • 开发语言漫谈-R语言
  • 超实用AI工具分享——ViiTor AI视频配音功能教程(附图文)
  • LeVERB:利用潜视觉-语言指令进行人形机器人全身控制
  • Oracle数据库捕获造成死锁的SQL语句
  • SDL渲染RGB图像
  • 高通手机跑AI系列之——穿衣试装算法
  • YOLOv10tensorRT推理代码C++
  • 虚拟化测试工具Parasoft Virtualize的两大核心功能及应用
  • 如何写出优秀的单元测试?
  • 【附源码】旅游网站系统设计与实现+SpringBoot + Vue (前后端分离)
  • 设计模式 | 建造者模式
  • 【机器学习深度学习】线性代数
  • 提升开发思维的设计模式(下)
  • Apache 支持 HTTPS
  • 【Linux】软硬链接,动静态库
  • 流程管理整体章程性方案及流程中的各种操作的定义和说明
  • 2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(四)
  • 【机器学习深度学习】线性回归
  • SpringBoot 中使用 @Async 实现异步调用​