Spring-datasource事务管理-手动请求事务回滚

什么场景下会触发?

在 Spring 中,调用 setRollbackOnly() 方法会将当前事务标记为 rollback-only,表示事务只能回滚,不能提交。这种情况通常发生在以下情景中:

  1. 业务逻辑判断:在方法中根据某些业务逻辑的判断,确定当前事务应该回滚而不是提交时,可以调用 setRollbackOnly() 方法将事务标记为 rollback-only。例如,在某些条件下,业务需要取消当前事务的执行并回滚。

  2. 异常处理:当方法中发生了异常,但异常被捕获并处理后,根据业务逻辑需要将当前事务标记为 rollback-only,以确保事务回滚而不是提交。通常在捕获异常后,根据异常的类型或其他条件,决定是否将事务标记为 rollback-only。

  3. 外部条件:外部条件可能导致事务需要回滚,例如与外部系统的交互失败、数据一致性问题等情况下,可以将事务标记为 rollback-only。

总的来说,调用 setRollbackOnly() 方法通常是为了在事务执行过程中明确指示事务应该回滚而不是提交。这样可以确保事务在特定条件下的一致性和完整性。

举个例子

当某个订单支付失败时,需要将订单的支付状态设置为失败,并且将库存恢复,以保持系统数据的一致性。在这种情况下,我们可以使用 setRollbackOnly() 方法将事务标记为 rollback-only,以确保事务回滚。

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private InventoryService inventoryService;

    @Transactional
    public void processOrderPayment(Order order) {
        try {
            // 进行订单支付操作
            // 如果支付失败,抛出 PaymentFailedException
            processPayment(order);
        } catch (PaymentFailedException e) {
            // 支付失败处理逻辑
            // 设置订单支付状态为失败
            order.setStatus(OrderStatus.PAYMENT_FAILED);
            orderRepository.save(order);
            
            // 恢复库存
            inventoryService.revertInventory(order.getItems());
            
            // 将事务标记为 rollback-only
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

    private void processPayment(Order order) throws PaymentFailedException {
        // 实际支付逻辑,可能会抛出 PaymentFailedException
    }
}

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

org.springframework.transaction.interceptor.TransactionAspectSupport#currentTransactionStatus

org.springframework.transaction.interceptor.TransactionAspectSupport#currentTransactionInfo

org.springframework.transaction.support.AbstractTransactionStatus#setRollbackOnly

最终在申明式事务commit逻辑中会进行判断(方法没有抛出异常-commit逻辑中会进行rollBack)

所以:

不要再认为:只要方法执行成功,没有出现异常,那么方法上面的事务一定会执行提交。这个并不是绝对的!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[GFCTF 2021]wordy

用ida查看可知存在大量jmp跳转语令,编写脚本将其改为空指令

MyBatis Dynamic SQL基本使用

MyBatis Dynamic SQL基本使用 一、概念二、特性Hamcrest是什么 三、MyBatis Dynamic SQL 快速入门3.1 环境准备3.2 定义表和列3.3 创建 MyBatis3 映射器3.4 使用 MyBatis3 执行 SQL 四、数据库对象表示4.1 表或视图表示4.2 表别名4.3 列表示 五、Where 子句支持5.1 简单的 wher…

磁盘损坏无法读取:原因、恢复方案与防范之道

在数字化信息爆炸的时代,磁盘作为数据存储的重要载体,承载着无数重要的文件和资料。然而,当磁盘突然损坏,无法读取数据时,我们往往会陷入困境,焦虑不已。面对这种情况,我们该如何应对&#xff1…

晶圆制造之MPW(多项目晶圆)简介

01、MPW是什么? 在半导体行业中,MPW 是 "Multi Project Wafer" 的缩写,中文意思是多项目晶圆。MPW 的主要思想是将使用相同工艺的多个集成电路设计放在同一晶圆片上进行流片(即制造)。这种方法允许多个设计共…

设计模式-构建者模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 定义 特点 使用场景 优缺点 (1) 优点 …

26.组件传递Props效验

组件传递Props效验 Vue 组件可以更细致地声明对传入的 props 的校验要求 <template><h3>ComponentA</h3><ComponentB title"Props效验" :userInfo"userInfo"/> </template> <script> import ComponentB from ".…

Linux操作系统·Linux简介

1.世界上第一个完善的网络操作系统 Unix是1969年由美国电话电报公司(AT&T)贝尔实验室的两个工程师所创造的操作系统&#xff0c;它允许计算机同时处理多用户和程序。目前大型政府单位、大型企业、航空公司、金融机构多在使用&#xff0c;价钱昂贵&#xff0c;但性能和稳定性…

【数据结构】99%的人都知道的超好用二叉搜索树

【数据结构】99%的人都知道的超好用二叉搜索树 笔者近期学习了二叉搜索树&#xff0c;与其说是学习了此种数据结构&#xff0c;倒不如说是先在力扣上做了相关题目&#xff0c;而后觉得对其了解甚浅&#xff0c;于是再去找资料…今天就结合力扣题目&#xff0c;向大家介绍一下二…

Spring Cloud 运维篇1——Jenkins CI/CD 持续集成部署

Jenkins 1、Jenkins是什么&#xff1f; Jenkins 是一款开源 CI/CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者一个独立的 Java 程序。 Jenkins Docker Compose持续集成流…

没有理由不加倍努力

最近su7很火&#xff0c;各隐藏大佬都纷纷从后台来到前台&#xff0c;把整个网红界的网红等级提升了好几个档次。红衣大叔更是借此机会在疯狂地打造自己的网红IP。 千亿大佬都这还般努力&#xff0c;作为平民的自己哪还有不努力的理由。 加倍努力&#xff01;

如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?

文章目录 一、启用pg_stat_statements插件二、查看统计信息三、定期重置统计信息四、注意事项 PostgreSQL中的pg_stat_statements是一个强大的插件&#xff0c;用于追踪执行时间最长的SQL语句。通过它&#xff0c;我们可以获取有关SQL语句执行频率、总执行时间、平均执行时间等…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

C++相关概念和易错语法(5)(析构函数、拷贝构造、运算符重载、赋值重载)

上篇文章分享了一些构造函数和析构函数的易错点&#xff0c;这篇文章则将继续分享一些构造函数、拷贝构造函数的易错点。 1.变量声明处赋缺省值 我们已经知道了自动构造函数的初始化规则了。我们可以认为这个初始化规则比较保守&#xff0c;能不修改成员变量的值就不修改&…

实在RPA设计器试用导引

一、产品概述 实在RPA设计器是一款将人工智能(AI)与机器人流程自动化(RPA)深度融合的可视化自动流程编辑器。它通过AI推荐与桌面嵌入式交互&#xff0c;极大简化了RPA的使用难度&#xff0c;让普通业务人员也能轻松使用。实在RPA设计器具备以下核心优势&#xff1a; 兼容性&a…

Redis详解和Spring Data Redis应用

注意事项 如何快速进入命令行窗口什么是配置类 Redis简介 Redis是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&#xff09…

数电期末复习(二)逻辑代数基础

这里写目录标题 2.1 二值逻辑变量与基本逻辑运算2.1.1 与运算2.1.2 或运算2.1.3 非运算2.1.4 常用复合逻辑运算 2.2 逻辑函数的建立及其表示方法2.2.1 真值表表示2.2.2 逻辑函数表达式表示2.2.3 逻辑图表示方法2.2.4 波形图表示方法 2.3 逻辑代数2.3.1 逻辑代数的基本定律和恒等…

从例题出发,提高离散数学兴趣(一)集合关系

关系的性质&#xff1a;(反)自反性&#xff0c;&#xff08;反&#xff09;对称性&#xff0c;可传递性&#xff01; 例题一&#xff1a; 复合关系与逆关系&#xff1a; 例题二&#xff1a; 覆盖与划分与等价关系&#xff1a; 重要的证明&#xff1a; 偏序关系&#xff08;自反…

Java面试八股之System.gc和Runtime.gc的作用分别是什么

System.gc和Runtime.gc的作用分别是什么 从代码中我们能看出&#xff0c;这两个方法其实本质上都是调用的Runtime类中的gc()方法&#xff0c;并且Runtime类中的gc()是一个native方法。之前我们也讲过&#xff0c;这个仅仅是给JVM一个垃圾回收的信号&#xff0c;具体是否进行垃圾…

对组合模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1090)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现&#xff08;假的组合模式&#xff09;1、代码2、为什么上面的写法是假的组合模式&#xff1f; 三、实现&#xff08;真的组合…