生产问题-并发重复生成订单(幂等性)问题

news2024/11/15 10:33:53

情景回顾

某天运营同事发现管理后台生成了两条重复的订单,反馈到技术部门进行紧急排查。

伪代码分析

通过排查代码发现,发现核心代码有并发问题,根据事务传递性锁中的事务无法独立生效,所以锁释放时事务并没有提交,此时新的请求获得锁时查询到的数据依然是更新前的数据,故锁没有起到应有的效果。
代码如下:

	@Override
    @Transactional(rollbackFor = Exception.class)
    public void addOrder(User user) {
        RLockTemplate.lockGet(user.getUserId(),()->{
            //进行生成订单操作 insert into t_order
            saveOrder(user.getUserId());//这个方法底层也有事务
            return true;
        });
        //保存日志 insert into t_log
        saveLog(user.getUserId());
    }

在这里插入图片描述

解决方案

这里去掉最外层的事务,将事务放在分布式锁里面。

解决幂等性问题总结建议

事务应该在分布式锁的里面进行控制。首先获取分布式锁保证在分布式环境中相关操作的原子性和一致性,之后在锁的保护下进行事务操作,这样可以确保在并发环境下,对共享资源的访问和修改是安全的,操作完成后再释放分布式锁。如果把事务放在分布式锁的外面,则无法保证事务内的操作在并发场景下的安全性和一致性。

其他:

  1. 唯一事务号或ID:
    API调用时传递一个唯一标识符(比如UUID或数据库自增ID),服务端对这个ID做校验和记录,确保相同ID的请求只被执行一次。

  2. 数据库唯一约束:
    在数据库表中设置唯一约束或索引,可以防止相同的记录被插入多次。

  3. 乐观锁:
    在数据表中使用版本号或时间戳字段,当进行更新操作时检查这个版本号是否变化,若没变化则允许更新,否则拒绝,以此避免数据重复操作。

  4. 分布式锁:
    使用类似Redis、ZooKeeper这样的分布式锁工具,在执行关键部分前获得锁,确保分布式环境中同时只有一个线程能操作共享资源。

  5. Token机制:
    服务端生成一个Token返回给客户端,客户端执行操作时携带这个Token,服务端通过Token来识别请求,执行成功后Token失效,确保请求只被执行一次。

  6. 幂等框架:
    使用一些成熟的框架比如Idempotent、Spring Retry等,可以直接在方法上添加注解来实现幂等性,无需自己实现复杂的逻辑。

  7. 消息队列:
    使用消息队列确保消息消费的幂等性,比如Kafka等持久化消息,配合消息的offset实现消息处理的幂等性处理。

具体使用哪种方案取决于系统的需求和架构设计。一些方案可能要与业务紧密结合,有些则可以通过中间件来解耦实现。

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

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

相关文章

Redis分布式锁的使用案例

一、引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.5.0</version> </dependency> 二、工具类 package com.hl.redisdemo.util;import redis.clients.jedi…

蓝桥杯Web应用开发-CSS3 新特性

CSS3 新特性 专栏持续更新中 在前面我们已经学习了元素选择器、id 选择器和类选择器&#xff0c;我们可以通过标签名、id 名、类名给指定元素设置样式。 现在我们继续选择器之旅&#xff0c;学习 CSS3 中新增的三类选择器&#xff0c;分别是&#xff1a; • 属性选择器 • 子…

Swin-UMamba:结合基于ImageNet的预训练和基于Mamba的UNet模型

摘要 https://arxiv.org/pdf/2402.03302v1.pdf 准确的医学图像分割需要整合从局部特征到全局依赖的多尺度信息。然而&#xff0c;现有方法在建模长距离全局信息方面面临挑战&#xff0c;其中卷积神经网络&#xff08;CNNs&#xff09;受限于其局部感受野&#xff0c;而视觉转换…

python学习21

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

JavaScript中闭包的定义、原理及应用场景

JavaScript是一门以函数为核心的编程语言&#xff0c;其独特的闭包特性是众多开发者所喜爱的特点之一。闭包是一种非常强大的概念&#xff0c;可以帮助我们实现许多复杂的功能和逻辑。本篇博客将为大家深入介绍JavaScript中闭包的定义、原理及应用场景&#xff0c;并通过示例代…

jpeg交叉编译(rv1126)

1.下载 官网下载地址 Independent JPEG Group (ijg.org) 2.解压 1)新建文件夹,解压源码(文件夹 jpeg-9f) 2)新建install-rv1126文件夹 具体目录结构如下图所示。 3.配置 1)进入源码文件夹jpeg-9f 2) export CC=/usr/bin/arm-linux-gnueabihf-gcc ./configure CC=…

Netty中使用编解码器框架

目录 什么是编解码器&#xff1f; 解码器 将字节解码为消息 将一种消息类型解码为另一种 TooLongFrameException 编码器 将消息编码为字节 将消息编码为消息 编解码器类 通过http协议实现SSL/TLS和Web服务 什么是编解码器&#xff1f; 每个网络应用程序都必须定义如何…

STM32Cubmax stm32f103zet6 SPI通讯

一、基本概念 SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI 接口主要应用在 EEPROM&#xff0c; FLASH&#xff0c;实时时 钟&#xff0c; AD 转换器&#xff0c;还有数…

Ubuntu下anaconda的常用操作

Ubuntu下anaconda的安装及常用操作 安装Anaconda 下载Anaconda&#xff1a;在Anaconda官网下载适合你系统的Anaconda安装包&#xff08;通常是64位的Linux版本&#xff09;。 安装Anaconda 在终端中导航到你下载Anaconda安装包的目录&#xff0c;然后运行以下命令安装Anacon…

Verilog刷题笔记19

题目&#xff1a; A common source of errors: How to avoid making latches When designing circuits, you must think first in terms of circuits: I want this logic gate I want a combinational blob of logic that has these inputs and produces these outputs I want…

Avalonia学习(二十三)-大屏

弄一个大屏显示的界面例子&#xff0c;但是代码有点多&#xff0c;还有用户控件。 目前还有一点问题在解决&#xff0c;先看一下界面效果。

人工智能 | 深度学习的进展

深度学习的进展 深度学习是人工智能领域的一个重要分支&#xff0c;它利用神经网络模拟人类大脑的学习过程&#xff0c;通过大量数据训练模型&#xff0c;使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来&#xff0c;深度学习在多个领域取得了显著的进展&#…

2024无参考图像的清晰度评价方法

无参考图像质量评价算法 无参考图像质量评价是指参考图像不存在的情况下&#xff0c;直接计算失真图像的视觉质量。根据无参考图像质量评价模型在计算图像视觉质量时是否需要图像的主观分数来进行训练&#xff0c;无参考图像质量评价算法可分为基于监督学习的无参考图像质量评价…

艺术创作和生活的关系

艺术出现在生产劳作中并体现出人们生活、工作、学习中&#xff0c;使人们在不受限制随意发挥缔造发明能力的体现&#xff0c;独立的精神活动领域在它逐渐演变进步的历程中越来越明显&#xff0c;也是一个人精神思想生活中很重要的一部分。艺术随着社会发展而发展。一件完美的艺…

神经网络的权重是什么?

请参考这个视频https://www.bilibili.com/video/BV18P4y1j7uH/?spm_id_from333.788&vd_source1a3cc412e515de9bdf104d2101ecc26a左边是拟合的函数&#xff0c;右边是均方和误差&#xff0c;也就是把左边的拟合函数隐射到了右边&#xff0c;右边是真实值与预测值之间的均方…

FPGA设计Verilog基础之Verilog全局变量和局部变量定义

注意&#xff1a;后续技术分享&#xff0c;第一时间更新&#xff0c;以及更多更及时的技术资讯和学习技术资料&#xff0c;将在公众号CTO Plus发布&#xff0c;请关注公众号&#xff1a;CTO Plus 在Verilog中&#xff0c;变量可以分为全局变量和局部变量两种类型。全局变量在整…

FLIP解读

title: FLIP解读 mathjax: true toc: true date: 2024-02-06 17:22:20 categories: Machine Learning tags:CLIPMasked AutoencodersContrastive Learning FLIP由CLIP改进而来&#xff0c;其思想非常简单&#xff0c;通过在图片侧mask掉相当比例的patch&#xff08;无须重构pa…

瑞萨RA6M3开发实践指南-UART实践

1.背景说明 本文是参考瑞萨RA6M3开发实践指南文章教程&#xff0c;基于瑞萨HMI-Board BSP :1.1.1 版本 RT-Thread 5.0.1 版本操作步骤进行记录&#xff0c;整理成的文档。 1.1 本章内容 使用RT-Thread Studio创建开发板的程序&#xff0c;编写UART的程序&#xff0c;实现串口…

万物皆可问 — 私有部署网易有道QAnything

什么是 QAnything&#xff1f; QAnything&#xff08;Question and Answer based on Anything&#xff09;是一个本地知识库问答系统&#xff0c;旨在支持多种文件格式和数据库&#xff0c;允许离线安装和使用。使用QAnything&#xff0c;您可以简单地删除本地存储的任何格式的…