读已提交隔离级别下竟然有间隙锁

业务背景

广告主痛点的为进行一次全媒体联合投放,若投放10个媒体,需要制作和上传10+个创意、50+张不同尺寸和出血区要求的图片和视频素材、近100个元素,投放成本极高。这也是制约部分用户使用新产品投放的原因。

因此进行升级。以三个创意为例。广告主上传一个创意包,开发通过业务逻辑进行拆分为3个创意。整个过程用户只需要操作一次,体验感极佳。

在上面的图中,我们可以看到在右边一个创意包变为3个创意的时候,也是需要绑定到单元上。
其中创意包的绑定是用户触发。而后台绑定的操作是包绑定的binlog触发

问题

在一个阳光明媚的中午,在没有做任何发布的中午,业务同学找过来因为死锁导致绑定创意失败了,有客诉。那必须要重视一下这个问题了。

Deadlock found when trying to get lock; try restarting transaction More

当用户同时绑定多个创意包有普通创意时(即用户先绑定了一个普通创意后,用户在同时绑定两个创意包),此时会出现死锁的问题。

定位问题
找日志并分析

从应用日志来看,其实你并不知道你和谁冲突,因为死锁触发后会有一方是成功的。
此时只能求助DBA去排查。

其实很庆幸的是db里是有冗余trace的,所以发生死锁后我日志中会trace。
通过trace在加上日志系统是可以判断出并发的源头是下面红线的地方。

理论去证明问题

不过在日志中我发现了一个关键词lock_mode X locks gap,这不是八股文中的间隙锁和临间锁吗???
这种不应该是在可重复度隔离级别下解决幻读才会出现吗?我还用GPT问了一下
在这里插入图片描述

其实就在这,理论与实际发生冲突了,无解了。
我请教了一下DBA的同学,DBA同学给了个文档说案例3就是你的情况。

案例三用我们的问题去推演

T1T2
beginbegin
insert into order_tb ( id, biz_number, adgroup_id, creative_id, campaign_id, cust_id, member_id, product_id, ref_type, flow_ratio, online_status, audit_status, audit_time, audit_reason, op_id, task_id, action_id, start_time, end_time, begin_time, stop_time, gmt_create, gmt_modified) values ( 14352655886, 0, 69735327295, 562734517, 69741860133, null, 40730745, 136001001, 0, null, 1, -1, ‘2024-02-29 14:14:05’, null, ‘0b64cf9617091872303006231d2e8c;9.1.1.7.1.6.6’, 0, 0, null, null, null, null, NOW(), NOW())
此时获得唯一索引的行锁
insert into order_tb ( id, biz_number, adgroup_id, creative_id, campaign_id, cust_id, member_id, product_id, ref_type, flow_ratio, online_status, audit_status, audit_time, audit_reason, op_id, task_id, action_id, start_time, end_time, begin_time, stop_time, gmt_create, gmt_modified) values ( 14352655886, 0, 69735327295, 562734517, 69741860133, null, 40730745, 136001001, 0, null, 1, -1, ‘2024-02-29 14:14:05’, null, ‘0b64cf9617091872303006231d2e8c;9.1.1.7.1.6.6’, 0, 0, null, null, null, null, NOW(), NOW())
此时因为唯一索引发生冲突且没有拿到行锁,触发间隙锁,锁范围,此时等待T2
insert into order_tb ( id, biz_number, adgroup_id, creative_id, campaign_id, cust_id, member_id, product_id, ref_type, flow_ratio, online_status, audit_status, audit_time, audit_reason, op_id, task_id, action_id, start_time, end_time, begin_time, stop_time, gmt_create, gmt_modified) values ( 14425938786, 0, 69735327295, 562714621, 69741860133, null, 40730745, 136001001, 0, null, 1, -1, ‘2024-02-29 14:14:05’, null, ‘0b64cf9617091872303066232d2e8c;9.1.1.6.1.6.6’, 0, 0, null, null, null, null, NOW(), NOW())
此时因为插入的位置在间隙锁的范围内,所以此时等待T1
执行成功触发死锁error释放资源
为什么会出现唯一冲突

业务侧的逻辑为:当收到创意包绑定单元的时间后,有一个全删全增的动作。如果用户同时绑定两个创意包,此时业务侧会收到两个请求,此时都执行全删全增的时候就会有插入的交集,从而触发唯一冲突。又因为主键序列通过区间段实现(不严格有序),所以后面会命中在间隙锁的范围从而出现死锁。

解决方案
  • 逻辑修改
    全删全增改为diff操作。这样做有两个好处:1)之前调用两个接口,现在调用1个 2)减少无效的binlog变更,甚至能规避环。
  • 解决并发
    当用户同时绑定多个创意包时,发送的binlog转mq的时候进行顺序消费,根据memberId路由到一个线程里。
  • 监控报警
    早发现早治疗。
参考

MySQL 并发insert 唯一键冲突导致的死锁

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

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

相关文章

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候,在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(四):消息队列MQ

文章目录 一、消息队列MQ二、RabbitMQ2.1 单机部署2.2 消息模型 三、SpringAMAP3.1 简单消息队列3.2 工作消息队列3.3 发布-订阅模型:FanoutExchange 广播交换机3.4 发布-订阅模型:DirectExchange 路由交换机3.5 发布-订阅模型:TopicExchange…

Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&#x…

推房子游戏c++

这段代码是一个推箱子游戏的实现。游戏中有一个地图,地图上有墙壁、人、箱子和目标位置。玩家通过键盘输入WASD或方向键来控制人物的移动,目标是将所有的箱子推到相应的目标位置上。 代码中的dt数组表示地图,每个位置上的字符表示对应的元素…

c语言在线聊天室

c语言基于tcp和多线程的在线聊天室(c语言通讯系统)功能需求 1.实现多线程 2.构建socke套接字实现一对一通信 3.实现多个电脑的通信 4.数据传输加密和解密 5.多人实时聊天 6.具备群聊和私聊的功能 实现原理: 服务端公网Ip暴露,客户端端口随机分配,通过服务端公网IP连接,服务端…

【开源】SpringBoot框架开发免税店商城管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…

【文本编辑】Typora v1.8.6 绿色版

下载地址 Typora v1.8.6 绿色版 简介 Typora 是一款简洁、直观的跨平台 Markdown 编辑器,旨在提供优雅的写作体验。与传统的 Markdown 编辑器不同,Typora 提供所见即所得的编辑界面,使用户可以即时预览 Markdown 文档的渲染效果&#xff0…

prometheus 原理(架构,promql表达式,描点原理)

大家好,我是蓝胖子,提到监控指标,不得不说prometheus,今天这篇文章我会对prometheus 的架构设计,promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…

性能测试干2年,还不会这个技术点?

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,记录的信息比较全面,结合nmon_analyzer工具产生数据文件与图形化结果。 nmon可监控的数据类型 内存使用情况、磁盘适配器、文件系统中的可用空间、CPU使用率等等数据信息 特点 ①占用…

Java零基础-数组的访问和遍历

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

使用CSS制作动态的环形图/饼图

使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样&#xff0c;去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…

持续更新 | 与您分享 Flutter 2024 年路线图

作者 / Michael Thomsen Flutter 是一个拥有繁荣社区的开源项目&#xff0c;我们致力于确保我们的计划公开透明&#xff0c;并将毫无隐瞒地分享从问题到设计规范的所有内容。我们了解到许多开发者对 Flutter 的功能路线图很感兴趣。我们往往会在一年中不断更改并调整这些计划&a…

Clock Verification IP

Clock Verification IP IP 参数及接口 IP 例化界面 相关函数 start_clock //产生时钟 <hierarchy_path>.IF.start_clockstop_clock //停止时钟 <hierarchy_path>.IF.stop_clockset_initial_value //设置时钟初始值为 0 <hierarchy_path>IF.set_initia…

Python和Google Colab进行卫星图像二维小波变化和机器学习

2D 小波分解是图像处理中的一种流行技术,使用不同的滤波器将图像分解为不同的频率分量(“近似”和“细节”系数)。该技术对于各种图像处理任务特别有用,例如压缩、去噪、特征提取和边缘检测。 在本文中,我们将演示如何在 Google Colab 中使用 Python 下载高分辨率样本卫星…

解决火狐浏览器访问地址受限制问题(This address is restricted)

问题如下图&#xff1a; This address is restrictedThis address uses a network port which is normally used for purposes other than Web browsing. Firefox has canceled the request for your protection. 此地址受到限制 此地址使用通常用于 Web 浏览以外的目的的网…

【Pytorch】进阶学习:基于矩阵乘法torch.matmul()实现全连接层

【Pytorch】进阶学习&#xff1a;基于矩阵乘法torch.matmul()实现全连接层 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

深入了解304缓存原理:提升网站性能与加载速度

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

微信小程序开发系列(十八)·wxml语法·声明和绑定数据

目录 1. 双大括号写法用法一&#xff1a;展示内容 步骤一&#xff1a;创建一个data对象 步骤二&#xff1a;双大括号写法的使用 步骤三&#xff1a;拓展 2. 双大括号写法用法二&#xff1a;绑定属性值 步骤一&#xff1a;给对象赋一个属性值 步骤二&#xff1a;双大括…

激光打标机红光与激光不重合:原因及解决方案

激光打标机红光和激光不在一个位置的问题可能由多种原因导致。以下是一些可能的原因和解决方法&#xff1a; 1. 激光器光路调整不当&#xff1a;激光器光路调整不当会导致激光束偏移&#xff0c;从而使红光与激光不重合。解决方法是重新调整激光器的光路&#xff0c;确保激光束…

【文档智能】再谈基于Transformer架构的文档智能理解方法论和相关数据集

前言 文档的智能解析与理解成为为知识管理的关键环节。特别是在处理扫描文档时&#xff0c;如何有效地理解和提取表单信息&#xff0c;成为了一个具有挑战性的问题。扫描文档的复杂性&#xff0c;包括其结构的多样性、非文本元素的融合以及手写与印刷内容的混合&#xff0c;都…