事务方法中存在远程调用

news2024/12/24 2:12:49

1. 背景

在实现下单的方法中,首先通过远程调用查询了地址簿信息和服务信息等,然后将这些信息和前端传入的预约时间、服务项等信息封装到order实体类,然后调用Mybatis-Plus提供的ServiceImpl类的save方法,向数据库表中插入数据。

@Slf4j
@Service
public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersCreateService {
   
     @Transactional(rollbackFor = Exception.class)
    public OrderResDTO placeOrder(OrderReqDTO OrderReqDTO) {
        // 下单前数据准备
        Orders orders = new Orders();
        
        //。。。远程调用获取数据,封装到orders中 。。。
        // 。。。 前端传入的数据,封装到orders中。。。

        //保存订单
        boolean save = this.save(orders);
        if (!save) {
            throw new DbRuntimeException("下单失败");
        }

        return new OrderResDTO(orders.getId());
    }


}

2. 在事务方法中存在远程调用是否有问题?

下单方法中远程调用查询地址簿信息和服务信息,远程调用涉及网络传输,如果网络传输时间过长会增加数据库事务的时长,如果并发高会把数据库的链接消耗殆尽,导致系统不能正常工作。

3. 探索方案

3.1 探索方案

将保存订单的代码移动add方法中,add方法只保存订单,去掉placeOrder方法上的@Transactional注解,在add方法上添加@Transactional注解,优化如下:

@Slf4j
@Service
public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersCreateService {
   
    public OrderResDTO placeOrder(OrderReqDTO OrderReqDTO) {
        // 下单前数据准备
        Orders orders = new Orders();
        
        //。。。远程调用获取数据,封装到orders中 。。。
        // 。。。 前端传入的数据,封装到orders中。。。

        //保存订单
        this.add(orders);
        return new OrderResDTO(orders.getId());
    }

    @Transactional(rollbackFor = Exception.class)
    public void add(Orders orders) {
        boolean save = this.save(orders);
        if (!save) {
            throw new DbRuntimeException("下单失败");
        }

}

经过测试发现事务控制失败,当add方法抛出异常数据库事务并没有回滚,订单信息保存成功。

3.2 失败原因

首先要明白Spring进行事务控制是通过代理对象进行的,在调用add方法之前开启事务,方法执行结束提交事务。

a2e2233c9dca4d1ab1ef26e3fc574245.png

失败原因:

非事务方法内部调用事务方法,不是通过代理对象去调用。

也就是说在placeOrder方法中通过this.add()调用add方法,this就是原始对象本身并不是代理对象。

4. 解决方案

在OrdersCreateServiceImpl注入OrdersCreateServiceImpl的代理对象,通过代理对象去调用add方法。

也就是将自己注入(实际会注入代理对象),然后通过这个注入调用add方法。

public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersCreateService {

    //将自己的代理对象注入
    @Resource
    private IOrdersCreateService owner;
    
    ...
    
    @Override
public OrderResDTO placeOrder(OrderReqDTO OrderReqDTO) {
    ...
    //保存订单
    owner.add(orders);

    return new OrderResDTO(orders.getId());
}

5. 总结

将插入数据库的代码封装到单独方法B中,去掉原方法A上的@Transactional注解,在单独的B方法上添加@Transactional注解,并且在原方法A中,修改原来插入数据库的代码为,通过将自己注入的代理对象来调用单独的B方法。

 

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

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

相关文章

基于51单片机的220V交流数字电流表proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1QmpPLvDTuW7QG7P-JCLPPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

直流无刷电机霍尔线序自学习解释

直流无刷电机霍尔线序自学习 步骤详解 1. 初始连接 连接电机的三相线&#xff1a;A、B、C。连接霍尔传感器线&#xff1a;HA、HB、HC。 2. 输入电压组合与霍尔信号记录 电机的电压输入组合和霍尔信号记录是电机控制系统中至关重要的一部分&#xff0c;它们决定了电机的运转…

CODESYS标准化编程之输入输出映射

在介绍输入输出映射之前大家需要了解开关量防抖滤波功能块,相关链接如下: 开关量防抖滤波器(梯形图和SCL源代码)_开关量输入滤波程序-CSDN博客文章浏览阅读724次。本文介绍了开关量防抖滤波器的原理和应用,包括梯形图和SCL源代码的实现。通过防抖滤波功能块,可以有效滤除低…

2024年9月15日

30min 1.配置数据库得到数据表 2.连接数据库 英语六级 遇到了报错

YOLOv10改进系列,YOLOv10颈部网络SPPF替换为FocalModulation

摘要 焦点调制网络(简称FocalNets),其中自注意力(SA)完全由焦点调制模块取代,用于在视觉中建模标记交互。焦点调制包括三个组件:(i)焦点情境化,通过一堆深度卷积层实现,从短到长范围编码视觉上下文,(ii)门控聚合,选择性地将上下文聚集到每个查询标记的调制器中…

OpenCV和Tesseract OCR识别复杂验证码喽~~

目录 代码实现思路 流程&#xff1a; 主要流程&#xff1a; 整体代码 效果展示 原图 处理之后的图 总结 流程图 代码实现思路 使用 OpenCV 进行图像预处理&#xff0c;并通过 Tesseract OCR 来识别验证码中的字符。以下是其实现思路的详细讲解&#xff1a; 流程&…

人工免疫算法(AIS算法)求解实例---旅行商问题 (TSP)

目录 一、采用AIS求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&a…

【AIGC cosplay】让大模型扮演求职者,我当hr来面试

【AIGC cosplay】让大模型扮演求职者&#xff0c;我当hr来面试 背景前摇&#xff08;省流可不看&#xff09;&#xff1a; 工位附近有几位人力资源的老师&#xff0c;我发现他们这个职位可以看到好多别人的简历&#xff0c;还能跟好多人聊天&#xff0c;完事了跟同事悄悄吐槽…

<<编码>> 第 12 章 二进制加法器--8位加法器 示例电路

8 位加法器内部结构 info::操作说明 鼠标单击逻辑输入切换 0|1 状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch12-08-8-bit-adder-internal.txt 8 位加法器 info::操作说…

操作系统——OS概述

操作系统——OS概述 操作系统概念 操作系统&#xff08;Operation System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的计算机程序。由此来看&#xff0c;OS是一种特殊的软件&#xff0c;它给用户和其他软件提供接口和环境&#xff0c;是计算机系统中最基本的系统…

20、Cereal

难度 高 目标 root 权限 2 Flag 使用VMware进行运行 信息收集 kali 192.168.152.56 靶机 192.168.152.65 第一次遇到这么快的端口扫描 可以看到存在ftp anoymous访问 同时还有大量的tcpwrapped状态&#xff0c;这个状态我还没见过 另外有个数据库和两个我网站服务&#xf…

4.TensorBoard的使用(一)--add_scalar()

Tensorboard的使用&#xff08;一&#xff09; TensorBoard 是一个可视化工具&#xff0c;用于监控和调试深度学习模型的训练过程。 1.使用add_scalar()进行简单绘图 首先需要导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的…

深入理解SpringBoot(一)----SpringBoot的启动流程分析

1、SpringApplication 对象实例化 SpringApplication 文件 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {// 传递的source其实就是类Bootstrapreturn new SpringApplication(sources).run(args);// 实例化一个SpringApplication对象执…

CSS—4

1.定位 1.相对定位 2.绝对定位 3.固定定位 4.粘性定位 5.定位的特殊应用 2.布局-版心 3.布局-常用布局名词 4.布局-重置默认样式

【云原生监控】Prometheus监控系统

Prometheus监控系统 文章目录 Prometheus监控系统资源列表基础环境一、部署Prometheus服务1.1、解压1.2、配置systemctl启动1.3、监听端口1.4、访问Prometheus仪表盘 二、部署Node-Exporter2.1、解压2.2、配置systemctl启动2.3、监听端口2.4、访问node-exporter仪表盘 三、配置…

Java接口的艺术:探索接口特性与面向接口编程

在Java的世界里&#xff0c;接口&#xff08;Interface&#xff09;是一种强大的抽象机制&#xff0c;它定义了一组方法规范&#xff0c;但不实现这些方法。接口在Java编程中扮演着至关重要的角色&#xff0c;特别是在实现多态和面向接口编程&#xff08;Interface-Oriented Pr…

Linux进程状态进程优先级

目录 一、操作系统的进程状态 1.1运行状态 1.2阻塞状态 1.3挂起 二、Linux下具体的状态 三、进程的优先级 3.1基本概念 3.2查看进程优先级的命令 3.3修改进程优先级的命令 3.4其他概念 3.5并发 一、操作系统的进程状态 1.1运行状态 当一个进程准备就绪&#xff0c…

MouseArea元素

常用信号 onClicked&#xff0c;鼠标点击onPressed&#xff0c;鼠标按下onReleased&#xff0c;鼠标释放 import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle{id:rectwidth: 100height: 100color:"red"MouseA…

redis基本数据结构-sorted set

1. sorted set的简单介绍 参考链接&#xff1a;https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A Redis的Sorted Set&#xff08;有序集合&#xff09;是一种数据结构&#xff0c;它是一个不重复的字符串集合&#xff0c;每个元素都有一个对应的分数&#xff08;score&…

模板方法模式:设计模式中的骨架法则

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 一&#xff0c;模板方法模式的…