首页 > 编程语言 >SpringBoot 手动控制事务,即编程式事务

SpringBoot 手动控制事务,即编程式事务

时间:2024-03-30 21:56:23浏览次数:24  
标签:回滚 手动 SpringBoot 编程 事务 try catch order

前置知识

  • Spring 事务默认只在发生未捕获的 RuntimeException 时才回滚
  • Spring AOP 异常捕获需要被拦截的方法显式的抛出异常。默认情况下 AOP 只捕获 RuntimeException 类的异常,但可以通过配置来捕获特定的异常

手动控制事务案例

在日常开发中,如果没办法使用 @Transactional 注解时(比如手动进行了 try catch、多线程操作、设置回滚点等)就得进行手动的编程式事务管理了

1.手动回滚try catch的异常处理

在try catch块中如果需要对事务进行回滚,就得强制使用Spring提供的事务切面类 TransactionAspectSupport

@Transactional
public void saveOmsOutboundOrder(OmsOutboundOrder order) {
    try {
        omsOutboundOrderDao.save(order);

        //模拟异常
        int sum = 1 / 0;
    }catch (Exception e){
        log.error("saveOmsOutboundOrder出现异常: ", e);

        //手动强制回滚事务
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

2.回滚到保存点

如果开启了一个事务,并且已经输入了很多的语句时,如果忽然发现上一条语句有问题,可以用 rollback 语句来让数据库状态恢复到事务执行之前的样子,然后一切再重来。因为这个问题,MySQL 提出了一个保存点 savepoint 的概念,就是在事务对应的数据库语句中打几个点,在调用 rollback 语句时能指定回滚到哪个点,而不是最初的原点

@Transactional
public void saveOmsOutboundOrder(OmsOutboundOrder order,OmsOutboundOrderDetail orderDetail) {

    Object savepoint = null;
    try {
        omsOutboundOrderDao.save(order);

        //设置保存点
        savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
        orderDetail.setOrderId(order.getId());
        omsOutboundOrderDao.save(orderDetail);

        //模拟异常
        int sum = 1 / 0;
    }catch (Exception e){
        log.error("saveOmsOutboundOrder出现异常: ", e);

        //手动强制回滚事务到保存点
        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);
    }
}

3.DataSourceTransactionManager

Spring 的事务处理中,通用的事务处理流程是由抽象事务管理器 AbstractPlatformTransactionManager 来提供的,由 PlatformTransactionManager 的具体实现类来实现

@Autowired
private DataSourceTransactionManager transactionManager;

//@Autowired
//private DataSourceTransactionManager transactionManager;

@Transactional
public void saveOmsOutboundOrder(OmsOutboundOrder order) {

    //TransactionStatus transaction = transactionManager.getTransaction(TransactionDefinition.withDefaults());
   
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
    definition.setPropagationBehaviorName("PROPAGATION_REQUIRED");
    TransactionStatus transaction = transactionManager.getTransaction(definition);

    try {
        omsOutboundOrderDao.save(order);

        //模拟异常
        int sum = 1 / 0;

        transactionManager.commit(transaction);
    }catch (Exception e){
        log.error("saveOmsOutboundOrder出现异常: ", e);

        //手动控制回滚异常
        transactionManager.rollback(transaction);
    }
}

标签:回滚,手动,SpringBoot,编程,事务,try,catch,order
From: https://www.cnblogs.com/52-IT-y/p/18106038

相关文章

  • JUC并发编程(七)
    1、不可变对象1.1、概念        不可变类是指一旦创建对象实例后,就不能修改该实例的状态。这意味着不可变类的对象是不可修改的,其内部状态在对象创建后不能被更改。不可变类通常具有以下特征:实例状态不可改变:一旦不可变类的对象被创建,其内部状态(字段或属性)将不会改......
  • java毕业设计企业人事管理系统(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的快速发展,企业管理逐渐向数字化、智能化方向迈进。人事管理作为企业内部管理的重要组成部分,其信息化水平直接关系到企业的运行效率和管理水......
  • java毕业设计汽车零件厂绩效管理(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代企业管理中,绩效管理是连接企业战略目标与员工个人目标的桥梁,它对于提升员工工作积极性、优化团队协作效率以及推动企业持续发展具有重要作用。对于......
  • Solo 开发者周刊 (第9期):Dawwin首位人工智能编程师或将改变未来?
    这里会整合Solo社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。好文推荐Dawwin首位人工智能编程师,未来又会怎么样?Darwinai是一家快速发展的视觉质量检测公司,为......
  • (七)Rust 通用的编程概念
    变量与可变性在Rust语言中,声明变量是使用let关键字,而且变量默认是不可改变的,一旦值被绑定在一个名称上,就不能给这个变量重新赋值,如果重新赋值的话,就会在编译的时候报错。这是Rust提供给我们的众多优势之一,让我们可以充分利用Rust提供的安全性和简单并发性来编写代码......
  • JAVA学习-网络编程.Java11标准化的HTTP Client
           Java11引入了标准化的HTTPClient,它提供了一种现代化、灵活且易于使用的方式来进行HTTP通信。下面是关于Java11标准化的HTTPClient的概述以及与其他比较和高级应用的说明:1.概述:       Java11标准化的HTTPClient是一种替代HttpURLConnection的新......
  • 【Lua硬件编程之】电机温度和振动4G远程监测
    【Lua硬件编程之】电机温度和振动4G远程监测1电机温度和振动监测介绍2温振传感器4G上云图示3代码实现讲解(基于FlexLuaDTU01采集器)4参考资料1电机温度和振动监测介绍可通过温振传感器测量电机表面的温度,电机三轴振动速度,电机的振动位移,通过这些物理量来感知电......
  • 基于SpringBoot的“游戏分享网站”的设计与实现(源码+数据库+文档+PPT)
    基于SpringBoot的“游戏分享网站”的设计与实现(源码+数据库+文档+PPT)开发语言:Java数据库:MySQL技术:SpringBoot工具:IDEA/Ecilpse、Navicat、Maven系统展示系统总体结构图网站首页界面图用户注册界面图游戏文章界面图交流论坛界面图个人中心界面图后......
  • EF Core 中使用事务
    使用事务项目2023/10/0514个参与者反馈本文内容默认事务行为控制事务保存点跨上下文事务使用外部DbTransactions(仅限关系数据库)使用System.Transactions显示较少选项事务允许以原子方式处理多个数据库操作。如果已提交事务,则所有操作都会成功应用到数据库。如果已回滚事务,则......
  • 初识分布式事务
    本地事务本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则:分布式事务分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:跨数据源的分布式事务跨服务的分布式事务综合情况在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多......