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

Transactional事务不生效案例与解决方案?

Transactional事务不生效案例与解决方案?

案例1:内部方法调用导致事务失效

问题描述:当类内部方法(如methodA)调用另一个事务方法(如methodB)时,若未通过代理对象调用,事务注解可能失效。

解决方案:

  • 将methodB移到另一个Service类中,确保通过Spring代理调用
  • 使用AopContext.currentProxy()获取当前代理对象并调用方法

示例代码:

@Transactional(rollbackFor = Exception.class)
public void methodA(Long id) {((YourService)AopContext.currentProxy()).methodB(id);
}
案例2:异常类型不匹配

问题描述:默认只对RuntimeException回滚,若抛出非受检异常或错误类型不匹配会导致事务不生效。

解决方案:

  • 明确指定回滚异常类型
@Transactional(rollbackFor = {Exception.class, BusinessException.class})
案例3:事务传播行为配置不当

问题描述:当需要独立事务时未使用REQUIRES_NEW传播级别,导致多个操作在同一事务中。

解决方案:

  • 对需要独立事务的方法使用REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {...}
案例4:异步回调中的事务问题

问题描述:在TransactionSynchronization.afterCommit()中执行数据库操作无法利用原有事务。

解决方案:

  • 在回调中显式创建新事务
  • 使用异步事务管理器
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void afterCommitAction() {...}
案例5:私有方法事务失效

问题描述:Spring事务基于AOP实现,对private方法无效。

解决方案:

  • 将事务方法改为public
  • 避免在同类中自调用
事务调试技巧
  • 启用事务调试日志
logging.level.org.springframework.transaction.interceptor=TRACE
logging.level.org.springframework.orm.jpa=DEBUG
  • 检查事务状态
TransactionSynchronizationManager.isActualTransactionActive()
TransactionSynchronizationManager.getCurrentTransactionName()
最佳实践建议
  • 事务方法保持public可见性

  • 明确指定rollbackFor属性

  • 避免过长的事务方法

  • 对需要独立提交的操作使用REQUIRES_NEW

  • 同类方法调用时注意代理机制限制
    service.methodB(id);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void methodB(Long protocolGoodsId) {
    //查看当前方法是否开启事务
    if (TransactionSynchronizationManager.isActualTransactionActive()) {
    log.info(“当前方法开启了事务”);
    }
    //查看当前方法事务id
    log.info(“当前方法事务上下问:{}”, TransactionSynchronizationManager.getCurrentTransactionName());
    }

问题:方法a执行成功后,调用了方法b,而方法部分调用失败,但是b方法中的数据会提交成功,不会回滚,猜测原因:方法a与方法b在同一事务上下文。
解决方法:在方法b上修改事务传播行为:

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

REQUIRES_NEW 的含义是:
🔁 不管外层是否有事务,都新建一个事务,并挂起外层事务。
这样:
Service 方法运行在自己的事务上下文中;
TransactionSynchronizationManager.getCurrentTransactionName() 将不同;
两个方法不在同一个事务上下文。
http://www.dtcms.com/a/292779.html

相关文章:

  • 基于深度学习Transform的steam游戏特征分析与可视化【词云-情感词典分析-主题分析-词频分析-关联分析】
  • Android 自动的文件管理器存在以下问题,文件管理器横竖屏切换会停止运行,如何解决
  • 多维基分析求导法则
  • DNS应用层协议
  • OEC 刷机Armbain 25.05后配置说明
  • Vue3中watch和watchEffect区别和用法
  • 安装UV(一个python工具)
  • C语言符号可见性控制与工程实践——深入理解 __attribute__((visibility)) 和 -fvisibility=hidden
  • 【bug】Yolo11在使用tensorrt推理numpy报错
  • 在线教育培训课程视频如何防下载、防盗录?
  • Java(LinkedList和ArrayList底层分析)
  • UML中的多重性详解
  • 【QT常用技术讲解】QSystemTrayIcon系统托盘
  • cuda做lut 去畸变示例
  • APT32F1732RBT8爱普特微电子 32位MCU国产芯片 智能家居/工业控制 首选
  • 【Word Press基础】创建一个自定义区块
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(7):自動詞 & 他動詞
  • Matlab学习笔记:矩阵基础
  • 鸿蒙卡片开发保姆级教程
  • 【Kubernetes】集群外使用 kubectl 命令连接集群
  • 数据结构 之 【排序】(直接选择排序、堆排序、冒泡排序)
  • LS-DYNA | 载荷与边界条件
  • 内网穿透利器:基于HTTPHTTPS隧道的代理工具深度解析
  • Monkey OCR简单介绍
  • 为什么要微调大语言模型
  • 高等数学-矩阵知识
  • rocky9-zabbix简单部署
  • 如何实战适配政务服务智能体中台?
  • 中烟创新灯塔大模型应用开发平台入选工信部“政务大模型应用典型案例”
  • 【Android】xml和Java两种方式实现发送邮件页面