MySQL遇到一死锁现象,记录一下

MySQL死锁记录(INSERT INTO ... SELECT.... ) 一、前言 在线上发布新功能后,追踪了日志记录,发现有死锁的报错记录。因业务复杂,仅简化问题,先将问题简化复原。特在此记录解决分析过程。 先抛出问题,后附解决方案; 事务A 事务B 1、 insert into user_01 (name,age) select name,age user_02 1、update user_02 set name = ‘lisi’ where id = ‘2’ 2、update user_02 set name = ‘lisi’ where id 阅读详情
遇到一死锁现象:
事务级别中使用了最高的隔离级别:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

一个事件中,先select,如果没有则insert,有则update
当两个请求同事到达时,死锁发生了

下面详细描述一下:

CREATE TABLE `t1` (
  `a` int(11) NOT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



事务1                                            事务2


begin;
select * from t1 where a = 88; #select会自动加一把共享锁
Empty set (0.00 sec)


                                                 begin;
                                                 select * from t1 where a = 88; #几乎同一时间也加了一把共享锁
                                                 Empty set (0.00 sec)
                                                 insert into t1 values(88, 10000);  #由于事务1加了共享锁,插入要等事务1提交
                                                 
insert into t1 values(88, 10000);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
#因为发现没有记录存在,也执行插入
#但是由于事务2也加了一把共享锁,导致死锁
#当前事务被迫结束并rollback了




                                                 Query OK, 1 row affected (6.37 sec) #插入成功

                                                                                                  

这种情况就是由于事务的隔离级别为SERIALIZABLE,select语句会隐式地加上LOCK IN SHARE MODE,但是这并不影响select查询出结果,它只是不可以修改

本想在select语句上显示地加上FOR UPDATE互斥锁,强制让另一事件查询都阻塞,但是因为那条记录一开始就不存在,FOR UPDATE并不能起作用,两个事务仍然都可以select,并且均返回无记录


那如何解决这个问题呢? 有两种方法:


一种是事件隔离级别设置为非SERIALIZABLE,select这里都会成功,应用层两个事件中都会继续执行,这样子一个事务插入成功了

但是另一事务肯定会插入失败,但是由于上面select语句均返回无记录,但确在插入时出错了,调用失败了,调用端发现失败只能重新发送请求 

另一种方法是,先不要select,先执行insert,然后根据结是否重复决定事务的后面处理流程,这样子一个事务插入成功,另一事务肯定会插入重复,重复后再执行修改


具体要根据业务特点决定使用适合的解决方法。


另外:大多数情况下不需要用到"SERIERLIZED"这个隔离级别,一般情况下"READ-COMMITTED"就可以满足要求了。

       
MySQL 死锁 死锁是数据库并发控制中的一个重要问题,需要管理员和开发者共同关注和解决。通过深入了解死锁的产生原因、掌握有效的检测方法和制定合理的解决方案,可以最大程度地减少死锁对系统性能和稳定性的影响。在处理死锁问题时,需要综合考虑事务的并发性、隔离性、一致性和持久性等多个方面,以达到最佳的系统性能和数据安全性。 阅读详情

相关推荐

记录select for update mysql 死锁问题

背景 项目要求某表单个列自增,但是where条件,并不是这个列所有的值都符合自增 想用select for update mysql 锁表后,查询最大值自增,后发现有死锁问题,先记录一下。 实例 以下代码在可重复读隔离级别下执行,表中原来只有1~10的rank。假如A、B两个事务同时试图插入rank为21和22的rank; @Transactional public void createBannerDeadlock(Banner banner) { banner.r

songkai558919的博客 5103

【数据库基础】MySQL数据库死锁产生的场景和解决方法

本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。

yubao0723的专栏 2873

mysql面试题15:MySQL 遇到过死锁问题吗,你是如何解决的?

当多个事务同时竞争相同的资源时,可能会发生死锁。死锁是指两个或多个事务互相等待对方释放锁资源,导致所有事务都无法继续进行的情况。

小小鱼儿小小林的博客 464

MySQL为什么会出现死锁?底层原理是什么?

例如,事务A持有资源X的锁定,并请求获取资源Y的锁定,而事务B持有资源Y的锁定,并请求获取资源X的锁定。当检测到死锁时,MySQL会选择一个事务作为死锁的牺牲者,将其回滚并释放其持有的资源,以解除死锁。设置适当的超时时间:为事务设置适当的超时时间,当一个事务等待锁的时间超过超时时间时,可以选择回滚事务,避免长时间的等待。优化事务的顺序:合理安排事务的执行顺序,尽量减少事务之间的资源竞争,从而减少死锁的可能性。减少事务持有锁的时间:尽量缩短事务持有锁的时间,减少资源的占用,降低死锁的风险。

长风破浪会有时的博客 560

rk3566-11.0新增device分区

1.增加块设备 2.修改根目录节点权限 3.开机启动自动挂载 增加块设备 1.修改parameter.txt文件,新增块设备大小及命名 device/rockchip/rk356x/rk3566_r/parameter.txt FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3566_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE

weixin_51115260的博客 3383

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 883

记录一次mysql死锁

mysql死锁

C18298182575的博客 1963

SAP 批量修改 工艺路线 和 BOM

1、在运维的过程中经常会遇到用户需要批量更改组件,或者是批量更改数量,还是组件里面的一些标识,当处理这些批量数据处理的业务时,BOM的批量更改一个想到的就是CS20,但是CS20当BOM需要替换的时候就不是很适用。当前工作区域:选择 SAP_ITEM 对BOM行项目进行变更,工艺路线也是可以批量更改的,根据实际的业务进行选择,我这里选择的就是BOM的组件变更。5、本博客将使用新的一种方式进行BOM的批量变更,标准的事务代码:CEWB对BOM进行批量更改。3、使用LSMW的方式进行BOM的批量更改。

我小时候很黑的博客 4093

一次“诡异”的mysql死锁问题

下面是mysql error.log中有关死锁部分的信息: 2020-02-11T15:09:21.788043+08:00 2341233 [Note] InnoDB: Transactions deadlock detected, dumping detailed information. 2020-02-11T15:...

weixin_41361498的博客 91

大语言模型原理与工程实践:行业大语言模型的评测:以金融行业大语言模型为例

大语言模型、金融行业、模型评测、自然语言处理、深度学习、Transformer、BERT、GPT 1. 背景介绍 近年来,大语言模型(Large Language Model,LLM)在自然语言处理(Natural Language Processing,NLP)领域取得了突破性的进

AI大模型应用之禅 136

抑制电磁干扰(EMI)的实用电路技术

抑制电磁干扰(EMI)的实用电路技术 qtFK_EMC_EMI 【导读】本系列文章的第 1 部分至第 4 部分详细介绍了开关电源稳压器引起的传导发射和辐射发射,包括噪声产生机制、测量要求、频率范围、适用的测试限值、传播模式和寄生效应。在第 5 部分中,我将基于这一理论基础介绍抑制电磁干扰 (EMI) 的实用电路技术。 一般来说,电路原理图和印刷电路板 (PCB) 对于实现出色的 EMI 性能至关重要。第 3 部分重点强调通过谨慎的元器件选型和 PCB 布局尽量减小“功率回路”寄生电感的重要性。电源转换

学海无涯的专栏 1187

索引合并引起死锁分析

线上服务报了一个死锁的异常阿里云后台的死锁信息如下 mysql的存储引擎是innodb隔离级别是READ COMMITED(这种隔离级别没有gap锁) sxc_yunke.crm_tag_relation表结构如下(条件中的target_id和tag_id都是普通索引) CREATE TABLE `crm_tag_relation` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一id', `life_cycle_id` bi.

m0_37561834的博客 520

31.XAPP1052乱序分析及处理

目录 1.XAPP1052乱序分析 2.XAPP1052乱序处理 2.1乱序处理方法选择 2.2 XAPP1052乱序处理代码详解 3.XAPP1052乱序处理后的波形分析 3.1发送引擎 3.2接收引擎 4.XAPP1052乱序处理后的带宽测试 5.下期内容 1.XAPP1052乱序分析 首先先给大家讲解下什么是PCIe的乱序。在PCIe系统中,乱序就是主机发送的TLP序列ID为1、2、3、4到从机,从机接收到的可能不是1、2、3、4。主机和从机如果都不解决乱序的问题,就会导致从机接

一个早起的程序员 1705

记录不存在如何加锁MySQL_innodb select for update 没有满足条件的记录的情况下 是怎么加锁的呢?...

在REPEATABLE-READ隔离级别下,如果两个线程同时对同一张表用SELECT…FOR UPDATE加锁,在没有符合该条件记录情况下,两个线程都会加锁成功。程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁。这是什么原因呢?//session_1mysql> select @@tx_isolation;+-----------------+| @@tx_is...

weixin_35918994的博客 1774

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

实战17:GCN+LSTM图卷积神经网络预警预测 完整代码数据集

实战17:GCN+LSTM图卷积神经网络预警预测 完整代码数据集

1945

mysql单表写入耗时_MySQL 为什么单表插入为什么会锁时间很长

如下,表 table_a 字段 id (主键),check_no(varchar 唯一索引),no_type 三个字段,这个表只有 insert 操作,没有查询,其他操作,数据量 1000 万左右另外一个表 table_b 数据量 1 万左右逻辑是这样:1.insert table_a valus(主键,单号,单号状态);2.步骤 1 插入成功之后 select * table_b from wh...

weixin_42485957的博客 820

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MySql 死锁

MySql 死锁一、什么是死锁InnoDB存储引擎定义了四种类型的行锁隔离等级对加锁的影响当前数据对加锁的影响二、为什么会形成死锁两阶段锁协议产生死锁的四个必要条件三、MySQL 如何处理死锁?杀死进程MySQL表间隙锁排他锁共享锁分析行锁定行锁优化四、如何避免发生死锁1.对索引加锁顺序的不一致很可能会导致死锁;2.Gap 锁往往是程序中导致死锁的真凶;3.为表添加合理的索引,如果不走索引将会为表的每一行记录加锁,死锁的概率就会大大增大;4.我们知道 MyISAM 只支持表锁,它采用一次封锁技术来保证事务之

wgchen 5106

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

记录一次MySQL死锁的分析与解决过程

一、问题描述 上周开发过程中,线下环境遇到一个死锁问题,借此机会正好分析下MySQL死锁的原因和解决方案,本篇文章会带你去如何查看死锁日志和分析、解决。 二、MySQL死锁介绍 1、MySQL 锁种类 MySQL InnoDB存储引擎提供了如下几种锁: (1)共享/排他锁(S/X锁) 共享锁(S Lock):允许事务读取一行数据,多个事务可以拿到一把S锁(即读读并行); 排他...

noaman_wgs的博客 4万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MySQL死锁日志的查看和分析

目录 一,关于MySQL的死锁 二,人造一个死锁的场景 三,查看最近一次死锁的日志 四,死锁日志的内容 1,事务1信息 2,事务1持有的锁 3,事务1正在等待的锁 4,事务2信息 5,事务2正在持有的锁 6,事务2正在等待的锁 7,死锁处理结果 五,关于mysql的八种锁 1,行锁(Record Locks) 2,间隙锁(Gap Locks) 3,临键锁(Next-key Locks) 4,共享锁/排他锁(Shared and Exclusive Locks) 5,意向共享

lkforce 3万+

【MySQL锁篇】MySQL死锁问题以及解决方案

mysql死锁及其解决办法

weixin_56738054的博客 1万+

MySQL死锁了怎么办(死锁的产生及解决方案),死锁的案例,死锁的排查,死锁的解决,如何避免死锁的发生

死锁是指2+的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

weixin_44797327的博客 1万+

MySQL死锁

死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

2401_89221704的博客 1799

MySQL只操作同一条记录也会死锁吗?

在数据库中,死锁指的是多个事务在竞争资源时,由于互相等待对方释放锁,导致无法继续执行,最终所有相关事务都被阻塞的情况。

m0_73735578的博客 624
上一篇: IP address could not be resolved: Temporary failure in name resolution
下一篇: Bosh vs Comet vs Long Polling vs Polling
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值