将TiDB换成MySQL之后,我踩了一个坑

在之前的文章《MySQL 分库分表与 TiDB,如何选择?》中,提到了TiDB与MySQL的高度兼容性,以及可以平滑迁移替换MySQL数据库的优势。正是因为这个优势,我们的一个项目踩到了一个坑。

事情的经过是这样的:在项目初期,经过评估和方案确认,我们决定采用TiDB作为数据库。由于TiDB与MySQL的高度兼容性,我们在开发环境中使用MySQL,而在测试环境中使用TiDB。在切换数据库时,我们只需要更换连接地址即可。然而,由于某些原因,在项目临近投产时,我们决定改为使用MySQL高可用集群。在灰度发布阶段,一切看起来都很顺利。然而,当第一轮灰度测试结束后,我们发现某个用户有一笔重复订单!

于是,我们开始分析原因。一开始怀疑是针对用户的分布式锁未生效,因此我们对代码进行了复查和测试,但没有发现问题。经过一番思考后,我将问题分析的方向转向了TiDB和MySQL高可用集群的差异上。TiDB是一款分布式数据库产品,采用了基于NewSQL理论的新一代分布式技术架构,具备数据强一致、水平弹性扩缩容、金融级高可用等优点。而MySQL高可用集群则是一个主从复制的三个节点结构,使用组复制技术将数据从主节点复制到从节点,采用的是异步复制方式。

为了找出问题所在,我将日志中与重复订单相关的关键时间点列出来,发现这笔重复订单与正常订单之间的时间相差不到1秒。结合MySQL集群的特点,我终于明白了问题所在:登记订单时访问的是主库,而查询订单以检查是否重复下单时访问的是从库。由于主从复制受到网络等各因素的影响,可能会导致延迟较久,从而无法查询到订单,导致未检查到重复。

由于异步复制的延迟是不可避免的,解决方案之一可以是检查重复下单时查询主库。不过,为了避免给主库增加查询压力,并结合业务特性,最终的解决方案是:交易结束后不主动释放用户分布式锁,而是让锁超时自动释放。

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

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

相关文章

解决Kibana初始化失败报错: Unable to connect to Elasticsearch

现象: 原因: docker run生成容器的时候,指定elastic server时指向了localhost 为什么不能是localhost, 因为这个localhost指向的是容器本身的网络,而elastic用的是物理网络,两个网络是隔离的,所以如果kiba…

STM32F4移植SPI注意事项

一、注意事项 可以看我之前移植的文章,那些就不提了,记得要复用,把IO复用成对应的功能io,然后还要注意时钟,看你需要的功能,去调对应的时钟,把时钟调匹配了,基本上不会有问题。 比如…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始,所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案,后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案,无一例外的是,无论是上架安卓应用还是上架IOS应…

# Apifox前后端开发人员使用场景

Apifox前后端开发人员使用场景 概述 官网:Apifox 快速入门 | Apifox 帮助文档 功能描述 1、在日常编程开发过程中经常使用前后端分离架构的模式,一个项目的落地会通过产品、开发、测试三方会审,对项目需求评审过后,前后端开发会…

【数据结构(二)】双向链表(4)

文章目录 1. 基本概念2. 管理双向链表的思路3. 代码实现 1. 基本概念 管理单向链表的缺点分析: ①单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。     ②单向链表不能自我删除,需要靠辅助节点 ,而双向…

Android studio2022.3项目,X5内核WebView页面,顶部栏不显示问题

顶部栏组件和WebView都位于Fragment页面中&#xff0c;顶部栏不显示可能是由布局类型导致&#xff0c;可以使用LinearLayout类型布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk…

机器学习技术栈—— 概率学基础

机器学习技术栈—— 概率学基础 先验概率、后验概率、似然概率总体标准差和样本标准差 先验概率、后验概率、似然概率 首先 p ( w ∣ X ) p ( X ∣ w ) ∗ p ( w ) p ( X ) p(w|X) \frac{ p(X|w)*p(w)}{p(X)} p(w∣X)p(X)p(X∣w)∗p(w)​ 也就有 p ( w ∣ X ) ∝ p ( X ∣ …

【献给过去的自己】栈实现计算器(C语言)

背景 记得在刚学C语言时&#xff0c;写了一篇栈实现计算器-CSDN博客文章。偶然间看到了文章的阅读量以及评论&#xff0c;居然有1.7w的展现和多条博友的点评&#xff0c;反馈。 现在回过头来看&#xff0c;的确有许多不严谨的地方&#xff0c;毕竟当时分享文章时&#xff0c;还…

【日常】爬虫技巧进阶:textarea的value修改与提交问题(以智谱清言为例)

序言 记录一个近期困扰了一些时间的问题。 我很喜欢在爬虫中遇到问题&#xff0c;因为这意味着在这个看似简单的事情里还是有很多值得去探索的新东西。其实本身爬虫也是随着前后端技术的不断更新在进步的。 文章目录 序言Preliminary1 问题缘起1.1 Selenium长文本输入阻塞1.2…

激光雕刻机的雕刻操作

今天小编带大家来学习一下在实践当中学习到的基础操作&#xff0c;激光雕刻机的雕刻玻璃操作&#xff0c;欢迎评论指正。 目录 什么是激光雕刻机 怎么操作激光雕刻机操作 打开电源 打开电脑&#xff0c;选择需要的软件 在CAD上进行绘图&#xff0c;绘图完成进行保存 在RD…

Ubuntu 20.04 调整交换分区大小

Ubuntu 调整交换分区大小 一、系统情况二、去除旧的交换分区文件三、配置并启用交换分区四、查看swap文件大小 一、系统情况 Ubuntu &#xff1a;Ubuntu 20.04.6 LTS 交换分区位置&#xff1a; cat /proc/swaps二、去除旧的交换分区文件 去掉旧的交换分区有两个步骤&#x…

C++实现线程安全的map

C++ 标准库里的容器是线程不安全的,在多线程下使用容器时,需要实现线程安全的容器。本篇博客介绍C++实现线程安全的map。 在C++中实现一个线程安全的map通常涉及到使用互斥锁(例如std::mutex)来确保在多线程环境中对map的访问是串行化的,从而避免竞态条件和数据损坏。以下…

广州一母婴店因设置0元购导致关店

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 广州的一家母婴用品网店Minitutu因双十一优惠券设置错误&#xff0c;导致所有商品变成0元购买&#xff0c;引发消费者疯狂抢购&#xff0c;15万多单订单中有800多万元的损失。店家无奈之下只能暂停营…

css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards

css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards 一、问题描述 在做一个弹窗动画提示的时候遇到了一个问题&#xff1a; 在动画结束的时候&#xff0c;移除元素时会有闪一下的问题&#xff0c;像这样&#xff1a; 我的动画结尾是这样的&#xff…

LaTex生成引文(参考文献)时出现乱序,想把引文按顺序显示的解决方法

LaTex生成pdf时文献应用会乱序&#xff1a; 引用bib格式的参考文献时&#xff0c;会这么写&#xff1a; \bibliographystyle{plain} \bibliography{%filename%.bib} 而plain的意思是用作者的姓名排序&#xff0c;而不是按照引用顺序&#xff0c; 解决方案&#xff1a; 所以…

redis高级案列case

案列一 双写一致性 案例二 双锁策略 package com.redis.redis01.service;import com.redis.redis01.bean.RedisBs; import com.redis.redis01.mapper.RedisBsMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; imp…

流体的压力

压力是流体力学中很重要的物理量&#xff0c;国际标准单位为 Pa&#xff08;帕斯卡&#xff09;&#xff0c;其他常用单位包括 MPa&#xff08;兆帕&#xff09;、atm&#xff08;标准大气压&#xff09;、Torr&#xff08;托&#xff09; 等。 在流体内部&#xff0c;压力是标…

数据结构树与二叉树的实现

目录 一、普通树的存储结构 1、双亲表示法 2.孩子表示法 二、二叉树 1.二叉树的顺序存储&#xff08;必须是完全二叉树&#xff0c;否则很浪费空间&#xff09; 1&#xff09;结构体 2.二叉树的链式存储 1&#xff09;结构体 2&#xff09;操作 1.创建一颗二叉树 2.创…

Linux内核mmap内存映射详解及例子实现

mmap在linux哪里&#xff1f; 什么是mmap&#xff1f; 上图说了&#xff0c;mmap是操作这些设备的一种方法&#xff0c;所谓操作设备&#xff0c;比如IO端口&#xff08;点亮一个LED&#xff09;、LCD控制器、磁盘控制器&#xff0c;实际上就是往设备的物理地址读写数据。 但…

【Zabbix监控二】之zabbix自定义监控内容案例(自动发现、自动注册)

一、自定义监控内容 案例&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过3个人&#xff0c;超过5个人就发出报警 1、在客户端创建自定义key 明确需要执行的linux命令 创建zabbix监控项配置文件&#xff0c;用于自定义Key #在zabbix的配…