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

@Transactional如何对分布式事务生效

说明:介绍 @Transactional 对分布式事务生效的一种情况

场景

如下,该方法根据主键删除用户,同时,调用其他服务的 API 删除该用户所拥有的角色记录。方法涉及多个服务数据库操作,需考虑分布式事务。

	@Overridepublic void delete3(Long id) {// 根据主键删除用户(本服务)userMapper.deleteById(id);// 调用 roleAPI 删除该用户所拥有的角色(其他服务)roleApi.deleteRoleByUserId(id);}

直接在方法上加 @Transactional 注解,@Transactional 是本地事务注解,只能控制本服务,跨服务的事务是不生效的。

    @Transactional@Overridepublic void delete3(Long id) {// 根据主键删除用户(本服务)userMapper.deleteById(id);// 调用 roleAPI 删除该用户所拥有的角色(其他服务)roleApi.deleteRoleByUserId(id);}

试试看,在其他服务操作这里,手动制造异常

    @Overridepublic void deleteRoleByUserId(Long id) {// 模拟异常int i = 1 / 0;roleMapper.deleteRoleByUserId(id);}

调用接口,执行该方法(删除 userId=142 的记录),可见用户被删除,但该用户对应的角色未被删除

在这里插入图片描述

但是

有一种情况,可使 @Transactional 注解对以上场景的分布式事务生效,即在其他服务发生异常的同时,使调用方也抛出异常,只要抛出异常被框架捕获,@Transactional 就能回滚本地事务。

怎么做呢?只需要让调用方执行完后返回 Boolean

    @Overridepublic Boolean deleteRoleByUserId(Long id) {// 模拟异常int i = 1 / 0;roleMapper.deleteRoleByUserId(id);return Boolean.TRUE;}

当方法发生异常时,抛出的异常无法封装到 Boolean 类型中,会让调用方抛出实例化异常,这样会迫使调用方回滚本地事务。

(被调用方抛出算数异常)

在这里插入图片描述

(调用方抛出解码异常)

在这里插入图片描述

导致本地事务被回滚

在这里插入图片描述

最后

以上代码在 yudao 框架中实验

http://www.xdnf.cn/news/1414477.html

相关文章:

  • Redis实现短信登录
  • 需要固定一个指针,再遍历另一个指针的都可以用双指针方法
  • 【系列11】端侧AI:构建与部署高效的本地化AI模型 第10章:LLM端侧部署
  • 二.Shell脚本编程
  • 在AlmaLinux或CentOS 8上编译安装ZLMediaKit流媒体服务器
  • CatBoost vs XGBoost:两大Boosting框架的全面对比
  • HTML5国庆网站源码
  • gdsfactory安装以及和klayout联调
  • 自学嵌入式第三十一天:Linux系统编程-进程间通信
  • 《程序员修炼之道》第七八九章读书笔记
  • Asible管理变量和事实和实施任务控制
  • 新手首次操作SEO核心要点
  • 深度学习周报(8.25~8.31)
  • 雪花算法生成分布式ID
  • C++ STL之哈希封装实现unordered_map/set
  • 第4章从一条记录说起-InnoDB记录结构
  • Redis六大常见命令详解:从set/get到过期策略的全方位解析
  • 如何用熵正则化控制注意力分数的分布
  • 【CVTE】C++开发 (提前批一面)
  • 【AI智能体】Dify 实现自然语言转SQL操作数据库实战详解
  • 【Spring】ApplicationListener监听器
  • 【芯片测试篇】:LIN总线
  • AI 赋能 Java 开发效率:全流程痛点解决与实践案例(一)
  • Linux/UNIX系统编程手册笔记:用户和组、进程凭证、时间以及系统限制和选项
  • 利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序
  • DRF快速构建RESTful API指南
  • redis详解 (最开始写博客是写redis 纪念日在写一篇redis)
  • C++内存序不迷茫:从CPU缓存一致性理解Memory Order
  • Wi-Fi技术——初识
  • 如何绕过 disable-devtool.js 打开控制台