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

业务背景

广告主痛点的为进行一次全媒体联合投放,若投放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.hqwc.cn/news/524925.html

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

相关文章

Python匿名函数有知道的吗?

1.函数 按照函数是否有名字分为有名字的函数和匿名函数 匿名函数:定义函数时,不再使用def关键字声明函数,而是使用lambda表达式 匿名函数在需要执行简单的操作时非常有用,可以减少代码冗余 2.有名字的函数 def fn(n):return …

【ONE·基础算法 || 滑动窗口】

总言 主要内容:编程题举例,理解滑动窗口的思想。(是什么?什么时候用?为什么能用?时间复杂度?如何写代码?)       文章目录 总言1、滑动窗口2、长度最小的子数组&…

vue组件之间通信方式汇总

方式1&#xff1a;props和$emit props和$emit仅仅限制在父子组件中使用 1.props&#xff1a;父组件向子组件传递数据 1.1 代码展示 <template><div><!-- 这是父组件 --><div>父组件中的基本数据类型age的值是:{{this.age}}</div><div>…

Stable Diffusion WebUI 中英文双语插件(sd-webui-bilingual-localization)并解决了不生效的情况

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍一款中英文对照插件 sd-webui-bilingual-localization&#xff0c;该插件可以让你的 Stable Diffusion WebUI 界面同时显示中文和英文&#xff0c;让我…

DFS和BFS以及练习题目(未完待续)

DFS和BFS 温馨提示&#xff1a;学习dfs之前最好先了解一下递归的思想。 递归思想 斐波那契 题目分析 题目代码 import java.util.Scanner; public class Main{static long dp[]; public static void main(String[] args) {Scanner scanner new Scanner(System.in);int t…

拿捏算法的复杂度

目录 前言 一&#xff1a;算法的时间复杂度 1.定义 2.简单的算法可以数循环的次数&#xff0c;其余需要经过计算得出表达式 3.记法&#xff1a;大O的渐近表示法 表示规则&#xff1a;对得出的时间复杂度的函数表达式&#xff0c;只关注最高阶&#xff0c;其余项和最高阶…

BC134 蛇形矩阵

一&#xff1a;题目 二&#xff1a;思路分析 2.1 蛇形矩阵含义 首先&#xff0c;这道题我们要根据这个示例&#xff0c;找到蛇形矩阵是怎么移动的 这是&#xff0c;我们可以标记一下每次移动到方向 我们根据上图可以看出&#xff0c;蛇形矩阵一共有两种方向&#xff0c;橙色…

可调恒定电流稳压器NSI50150ADT4G车规级LED驱动器 提供专业的汽车级照明解决方案

NSI50150ADT4G产品概述&#xff1a; NSI50150ADT4G可调恒定电流稳压器 (CCR) &#xff0c;是一款简单、经济和耐用的器件&#xff0c;适用于为 LED 中的调节电流提供成本高效的方案&#xff08;与恒定电流二极管 CCD 类似&#xff09;。该 (CCR) 基于自偏置晶体管 (SBT) 技术&…

近年来文本检测相关工作梳理

引言 场景文本检测任务&#xff0c;一直以来是OCR整个任务中最为重要的一环。虽然有一些相关工作是端对端OCR工作的&#xff0c;但是从工业界来看&#xff0c;相关落地应用较为困难。因此&#xff0c;两阶段的OCR方案一直是优先考虑的。 在两阶段中&#xff08;文本检测文本识…

世界上最伟大的商业模式是“让利”,总结10套消费返利玩转市场!

文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;很多企业家朋友说&#xff0c;生意越来越难做了&#xff0c;市场太卷、同行价格低、难招商、难融资、难推广&#xff0c;其实你是不懂“人心”&#xff…

COMSOL热应力仿真

热应力 热膨胀子节点 热膨胀输入类型 假如直接知道热膨胀大小&#xff0c;可以直接对热应变进行赋值。 约束与载荷 对于自由膨胀&#xff0c;可以添加抑制刚体运动。 案例分析 在参数部分&#xff0c;设定体积参考温度Tref&#xff0c;假定在25[degC]模型无热应变。 APP开发器-…

笔记78:软件包管理工具 apt 详解(包含常用 apt 命令介绍)

一、Ubuntu 的包管理工具 apt 过去&#xff0c;软件通常是从源代码安装的&#xff0c;安装步骤为&#xff1a;​​​​​​ 在Github上下载该软件的源码文件&#xff1b;查看Github上这个软件项目中提供的自述文件&#xff08;通常包含配置脚本或 makefile 文件&#xff09;&a…