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

业务背景

广告主痛点的为进行一次全媒体联合投放,若投放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数组表示地图,每个位置上的字符表示对应的元素…

JAVA后端开发面试基础知识(六)——Redis

1. 内存淘汰策略 noeviction:当内存不足以容纳新写入数据时,新写入操作会报错allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除近少使用的key。(这个是最常用的)allkeys-random:当内存不足以容纳…

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…

7. 阅读魔法书

题目&#xff1a;7.阅读魔法书 - 蓝桥云课 (lanqiao.cn) 代码&#xff1a; #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int main() {string str;cin>>str;int n,ans0;cin>>n;while(n--){string substr;ci…

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

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

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

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

java入门 类型学习

文章目录 一、比较float型与double型二、Java与C语言的不同三、float变量的声明四、字符串与字符类型五、算术混合运算的精度 一、比较float型与double型 float x 0.4f; double y 0.4;请问各位是不是感觉这两者好像是一样大的吧&#xff1f; 其实不然 因为&#xff1a;实际…

用logrote和split分割nohup.out日志

背景&#xff1a;用nohup运行jar包时候&#xff0c;会产生大量的日志文件&#xff0c;影响磁盘存储&#xff0c;生产环境大概1天有30个g 解决方案&#xff1a; 1、用split分割日志&#xff0c;代码在下面&#xff08;可以先测试一下&#xff09;&#xff0c;然后加入到定时任务…

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

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

LeetCode2834. Find the Minimum Possible Sum of a Beautiful Array

文章目录 一、题目二、题解 一、题目 You are given positive integers n and target. An array nums is beautiful if it meets the following conditions: nums.length n. nums consists of pairwise distinct positive integers. There doesn’t exist two distinct ind…

使用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…

python3.9 处理excel来实现类似excel中的vlookup功能

#本次工作中需要处理两个excel中的数据&#xff0c;使用vlookup查询后显示N/A然后就选择了python# import openpyxl# excel表格的绝对路径 path r"C:\Users\Administrator\Desktop\device.xlsx"# 打开表格对象 workbook openpyxl.load_workbook(path) # 打印Excel表…

PHP语言常见面试题:什么是PHP中的函数?如何定义和调用一个函数?

在PHP中&#xff0c;函数是一组可以重复使用的代码块&#xff0c;用于执行特定的任务。函数可以接收输入&#xff08;参数&#xff09;&#xff0c;执行一系列操作&#xff0c;并可能返回输出结果。通过使用函数&#xff0c;你可以将代码组织成可重用的模块&#xff0c;提高代码…

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…