事务的回滚与失效行为

  • 创建一张测试表
    在这里插入图片描述

  • AccountMapper

public interface AccountMapper {@Update("update account set balance = #{balance} where username = #{username}")int updateUserBalance(@Param("username") String username, @Param("balance") Integer balance);
}
  • BService接口与实现类
public interface BService {int updateUserBalance(@Param("username") String username, @Param("balance") Integer balance);}@Service
public class BServiceImpl implements BService {@Autowiredprivate AccountMapper accountMapper;@Override@Transactionalpublic int updateUserBalance(String username, Integer balance) {int res = accountMapper.updateUserBalance(username, balance);throw new RuntimeException("更新" + username + "异常!");}}
  • AService与实现
public interface AService {int updateUserBalance( @Param("balance") Integer balance);int updateUserBalanceV2(Integer balance);int updateUserBalanceV3(Integer balance);
}@Slf4j
@Service
public class AServiceImpl implements AService {@Autowiredprivate AccountMapper accountMapper;@Autowiredprivate BService bService;@Override@Transactionalpublic int updateUserBalance(Integer balance) {accountMapper.updateUserBalance("A",balance);try {bService.updateUserBalance("B",balance);}catch (Exception e){log.info("更新BService异常:{}",e.getMessage());}return 1;}@Overridepublic int updateUserBalanceV2(Integer balance) {return updateUserBalanceV3(balance);}@Override@Transactionalpublic int updateUserBalanceV3(Integer balance) {accountMapper.updateUserBalance("A",balance);accountMapper.updateUserBalance("A",balance);return 1;}}
  • 测试类
@MapperScan(basePackages = "com.test.mapper")
@SpringBootApplication
public class CloudApplication {public static void main(String[] args) throws Exception {ConfigurableApplicationContext context = SpringApplication.run(CloudApplication.class, args);AService aService = context.getBean(AService.class);aService.updateUserBalance(90);}}
事务测试
  • 多事务异常捕获测试

AService调用BService,此时BService是开启了事务的,BService抛出了异常,虽然AService捕获了异常,但此时A和B都可以回滚成功。

2025-01-08 11:39:19.936  INFO 21812 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2025-01-08 11:39:20.025  INFO 21812 --- [           main] c.sci99.cloud.service.impl.AServiceImpl  : 更新BService异常:更新B异常!
Exception in thread "main" org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-onlyat org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:870)at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:707)at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:633)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:386)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)at com.sci99.cloud.service.impl.AServiceImpl$$EnhancerBySpringCGLIB$$48c3527b.updateUserBalance(<generated>)at com.sci99.cloud.CloudApplication.main(CloudApplication.java:21)

Transaction rolled back because it has been marked as rollback-only。
都可以回滚成功,因为BService也是一个代理的对象,在BService的updateUserBalance方法执行完成后,代理对象发现当前已存在一个事务,并且使用了默认的事务传播行为,代理对象捕获了异常,并将当前事务标记为了异常回滚,做完这一步操作之后会继续向上抛出异常。

AService执行updateUserBalance完成后,代理对象提交之前发现已经标记了回滚,则此时会进行全局回滚。

  • 非代理对象测试
    @Overridepublic int updateUserBalanceV2(Integer balance) {return updateUserBalanceV3(balance);}@Override@Transactionalpublic int updateUserBalanceV3(Integer balance) {accountMapper.updateUserBalance("A",balance);accountMapper.updateUserBalance("A",balance);return 1;}
 public static void main(String[] args) throws Exception {ConfigurableApplicationContext context = SpringApplication.run(CloudApplication.class, args);AService aService = context.getBean(AService.class);//aService.updateUserBalance(90);aService.updateUserBalanceV2(90);}

通过AService直接调用代理对象的updateUserBalanceV2方法,
但是updateUserBalanceV2是没有开启事务的,在V2内调用了V3,此时事务是不会生效的,因为V3不是通过代理对象调用的。

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

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

相关文章

【C语言】_字符数组与常量字符串

目录 1. 常量字符串的不可变性 2. 关于常量字符串的打印 3. 关于字符数组与常量字符串的内存分布 1. 常量字符串的不可变性 char arr[10] "abcdef";// 字符数组char* p2 arr;char* p3 "abcdef"; // 常量字符串 尝试对常量字符串进行修改&#xff…

【GUI-pyqt5】QCommandLinkButton类

1. 描述 命令链接的Windows Vista引入的新控件他的用途类似于单选按钮的用途&#xff0c;因为他用于在一组互斥选项之间进行选择命令链接按钮不应单独使用&#xff0c;而应作为向导和对话框中单选按钮替代选项外观通常类似于平面按钮的外观&#xff0c;但除了普通按钮文本外&a…

69.基于SpringBoot + Vue实现的前后端分离-家乡特色推荐系统(项目 + 论文PPT)

项目介绍 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括家乡特色推荐的网络应用&#xff0c;在外国家乡特色推荐系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&…

HCIE-day10-ISIS

ISIS ISIS&#xff08;Intermediate System-to-Intermediate System&#xff09;中间系统到中间系统&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff1b;是一种链路状态协议&#xff0c;使用最短路径优先SPF算法进行路由计算&#xff0c;与ospf协议有很多相…

图像处理|膨胀操作

在图像处理领域&#xff0c;形态学操作是一种基于图像形状的操作&#xff0c;用于分析和处理图像中对象的几何结构。**膨胀操作&#xff08;Dilation&#xff09;**是形态学操作的一种&#xff0c;它能够扩展图像中白色区域&#xff08;前景&#xff09;或减少黑色区域&#xf…

【机器学习】量子机器学习:当量子计算遇上人工智能,颠覆即将来临?

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今科技飞速发展的时代&#xff0c;量子计算与人工智能宛如两颗璀璨的星辰&#xff0c;各自在不同的苍穹闪耀&#xff0c;正以前…

Sprint Boot教程之五十:Spring Boot JpaRepository 示例

Spring Boot JpaRepository 示例 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是一个基…

腾讯云AI代码助手编程挑战赛-桌面壁纸随机更换

作品简介 用于更换壁纸缓缓心情&#xff0c;或者选择困难症&#xff0c;每一个图片都想用来做壁纸&#xff0c;并且节约了手工时间&#xff0c;所以根据这个需求来创建的这款应用工具&#xff0c;使用的是腾讯云AI代码助手来生成的所有代码&#xff0c;使用方便&#xff0c;快…

说说你对作用域链的理解

一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "…

SpringBootWeb 登录认证(day12)

登录功能 基本信息 请求参数 参数格式&#xff1a;application/json 请求数据样例&#xff1a; 响应数据 参数格式&#xff1a;application/json 响应数据样例&#xff1a; Slf4j RestController public class LoginController {Autowiredpriva…

ASP.NET Core 实现微服务 - Consul 配置中心

这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大&#xff0c;还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件 &#xff0c;那么干脆继续使用 Consul 来作为配置…

DeviceNet转Profinet网关如何革新污水处理行业!

DeviceNet转Profinet网关如何革新污水处理行业&#xff1f;在污水处理行业中&#xff0c;随着环保法规的日益严格和处理技术的不断进步&#xff0c;工业自动化技术的应用越来越广泛。特别是在提高生产效率、降低运营成本以及确保处理质量方面&#xff0c;自动化技术发挥着不可替…

(四)结合代码初步理解帧缓存(Frame Buffer)概念

帧缓存&#xff08;Framebuffer&#xff09;是图形渲染管线中的一个非常重要的概念&#xff0c;它用于存储渲染过程中产生的像素数据&#xff0c;并最终输出到显示器上。简单来说&#xff0c;帧缓存就是计算机图形中的“临时画布”&#xff0c;它储存渲染操作生成的图像数据&am…

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景&#xff0c;并在其中添加一个旋转的球体。通过设置不同的光照参数&#xff0c;可以观察到球体表面材质的变化。 知识点 WebGLRenderer …

前端基础技术全解析:从HTML前端基础标签语言开始,逐步深入CSS样式修饰、JavaScript脚本控制、Ajax异步通信以及WebSocket持久通信

目录 前言&#xff1a; 1.前端技术html简单了解&#xff1a; 1.1HTML代码是由标签构成的。 1.2.HTML 文件基本结构 1.3.HTML 常见标签 标题标签: 段落标签: p 文本格式化标签 图片标签&#xff1a; 超链接标签: a 测试代码&#xff1a; 展示效果&#xff1a; 表单…

wireshark抓包工具新手使用教程

wireshark抓包工具新手入门使用教程 一、Wireshark软件安装二、Wireshark 抓包示范三、Wireshakr抓包界面四、Wireshark过滤器设置五、wireshark过滤器表达式的规则六、Wireshark抓包分析TCP三次握手七、Wireshark分析常用列标签格式 Wireshark是一款开源的网络协议分析工具&am…

中国省级产业结构高级化及合理化数据测算(2000-2023年)

一、数据介绍 数据名称&#xff1a;中国省级产业结构高级化、泰尔指数 数据年份&#xff1a;2000-2023年 数据范围&#xff1a;31个省份 数据来源&#xff1a;中国统计年鉴、国家统计局 数据整理&#xff1a;内含原始版本、线性插值版本、ARIMA填补版本 数据说明&#xf…

Qt 5.14.2 学习记录 —— 팔 QWidget 常用控件(3)

文章目录 1、cursor2、font3、toolTip4、focusPolicy5、styleSheeyt 1、cursor 改变鼠标光标形状。 在Qt Designer界面中&#xff0c;拖一个按钮过来&#xff0c;右边属性面用户可以自己改cursor属性。 代码方法&#xff0c;先拖一个按钮到界面上&#xff1a; #include <…

js:日期对象和dom节点

日期对象 事件对象在前端开发里经常用来表示日期&#xff1a; 可以获取当前系统的时间 实例化 使用new关键字来实例化一个对象&#xff1a; const date new Date()console.log(date); 获取当前时间 const date new Date(2008-8-8)console.log(date); 获取指定时间 写得…

minibatch时,损失如何记录

目录 minibatch时&#xff0c;损失如何记录 报错&#xff1a;UnboundLocalError: local variable coef referenced before assignment是什么回事 未溢出则不会报错&#xff0c;可以完整滴运行完成 indent 缩进 炫酷技能&#xff1a;一遍运行&#xff0c;一遍画图 实例1 解释…