首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mysql查询语句使用select.. for update导致的数据库死锁分析

如果要求更智能,oracle支持for update skip locked跳过锁区域,这样能不等待马上查询没有被锁住的下一个30条记录。 下面说下mysql for update导致死锁。...但同样的select .. for update语句怎么就死锁了呢?...同样的sql语句查询条件和结果顺序都一致,按理不会导致一个锁了主键索引,等待锁非主键索引,另外一个锁了非主键索引,等待主键索引导致死锁。...最后经过分析,我们项目里发现是for update的sql语句,和另外一个update非select数据的sql语句导致死锁。...虽然两个sql语句期望锁的数据行不一样,但两个sql语句查询或更新的条件或结果字段如果有相同列,则可能导致互相等待对方锁,2个sql语句即引起了死锁

3.6K10

MySQL 案例:Update 死锁详解

而锁冲突中,有一类很经典的场景经常会拿出来讨论:死锁。最近刚好也遇到了一个典型的死锁案例,本文基于这个案例,做一次详细的分析与拆解。...问题描述 细节信息已脱敏,由于innodb engine status记录最近一次死锁的细节信息,因此案例现场的信息是可以完整拿到的。...死锁的两个语句如下: UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476)...由于 MySQL 的锁机制的原因,只需要判断出两个 SQL 语句的锁存在循环等待,那么死锁的条件就会成立了。...实际上,自己观察一下这个死锁的有向环图例,会发现这两个语句用到了两个单列索引,那么进一步思考的话,如果这两个列建成了联合索引,这个死锁的案例是不是就可能不会发生了?

14.8K174
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL 使用 for update 引发死锁原因分析

    在之前的一次开发需求中使用了 for update 实现悲观锁,最后导致出现了很多的 MySQL 死锁报警,现记录下死锁产生的原因。...但是后来发现这个修改逻辑造成 MySQL 死锁。...死锁原因分析造成死锁的原因主要和 for update 对数据加锁的过程有些关系,加锁过程描述:MySQL innodb 存储引擎默认的隔离级别时 RR 级别,而RR隔离级别,默认是使用Next-key...经过上面的流程可以知道 for update 不仅锁住查询到的数据, 也锁住不满足查询条件的数据,当查询不到数据的时候甚至可能演变成表锁,因为不同事务的间隙锁可以重复加锁,所以当两个事务同时锁住某些相同的数据...,并对这部分数据进行修改时就会出现死锁的情况参考文章MySQL 锁类型总结MySQL 间隙锁,锁过程详解

    96040

    mysql insert duplicate key update 死锁分析

    背景 数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。...原因分析&解决方案 这里面分两种情况,一种是带主键的insert duplicate key update,一种是没有主键带唯一索引的insert duplicate key update。...这种情况比较简单,处理方式有两种: 1、减少batch大小,减少了同一批数据中包含相同数据的概率,也就减少了死锁发生的概率 2、入库前对sql按照id排序,即使出现相同数据,只要保证顺序相同就不会出现死锁...next-key锁包含record锁和gap锁,gap锁锁一个范围,锁住期间,其他事务不能向该范围插入数据。...如果插入数据时带上主键,那么就不会产生next-key锁,退化到第一种情况(带主键的insert duplicate key update)。

    4.1K11

    mysql update语句和原数据一样更新么

    平常使用 mysql ,必不可少的会用到 update 语句,不知道小伙伴有没有这样的疑问? 如果 update 语句和原数据一样更新么?...更具体的来说,如果更新的数据前后是一样的,MySQL 更新存储引擎中(磁盘)数据么? 关于这个问题,在分析之前我们可以思考下:update语句和原数据一样,有必要更新么?理论上来讲是没有必要的。...MySQL Server 层在执行 sql 时,其实是不知道是否是一样的,因此可以猜想,如果 MySQL 已经知道原数据的话,这样可以和 update 语句做对比,这样一样的话可以不用更新了。...那么 MySQL 在执行update 语句时,什么时候读取原数据呢?...row 格式的 binlog 记录镜像数据,针对 update 来说,必须是前镜像数据才能判断出来update 语句是否和原数据一样。

    1.7K20

    MySQL为什么死锁

    1️⃣ 死锁概述 在正式开始今天的讲解之前,我们先回顾一下死锁的相关知识 死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而导致的一种阻塞的现象,如果没有外力,他们将一直等待下去...就跟卡bug一样,比如说你去面试,面试官问你:MySQL为什么死锁;你告诉面试官:你录用我我就告诉你,面试官说:你告诉我我就录用你,然后你两就一直这么你问我我问你,这就是死锁。...= 6 for update语句属于非唯一索引的等值查询,会加上(6,+∞]的临键锁 select * from team where position_no = 7 for update语句属于非唯一索引的等值查询...,以雪花算法或者Redis去生成订单号,或者说可以给订单号这个字段加上唯一的索引…… 总结 今天的文章只是带大家简单走了一遍MySQL死锁情况,关于为什么死锁,讲完昨天的文章,也就是对查询时的加锁情况的讲解...,其实来分析这个死锁的情况并不是一件难事,最后也介绍了从数据库层面和业务层面如何去防止MySQL出现死锁的情况。

    1.1K20

    MySQL这样写UPDATE语句,劝退

    # 起因 最近,好几次有开发同学在钉钉上问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新… # 结论 小结:在一条UPDATE语句中,如果要更新多个字段...# 现象 刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是有区别,这里我用测试数据来模拟下: 有问题的SQL语句update apps set owner_code...分析 看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法: 看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写...小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。...因此,这个逻辑表达式的结果为false,false在MySQL中等价于0!

    3.2K20

    MySQL这样写UPDATE语句,劝退

    来自:ju.outofmemory.cn/entry/336774 最近好几次有开发同学在钉钉上问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新...刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是 有区别 ,这里我用测试数据来模拟下: 有问题的SQL语句 执行之前的记录是这样的: 执行之后的记录是这样的...看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法: 看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写...小结 : 在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。...因此,这个逻辑表达式的结果为 false , false在MySQL中等价于0!

    3.9K40

    面试官:MySQL 唯一索引为什么导致死锁

    如果在insert into 语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE...死锁 insert … on duplicate key 在执行时,innodb引擎先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后...mysql执行完duplicate后的update操作, 然后对该记录加上X(排他锁),最后进行update写入。...id的改变;insert … on duplicate key update在遇到重复行时,直接更新原有的行,具体更新哪些字段怎么更新,取决于update后的语句。...参考 Mysql中unique与primary约束的区别分析(转) MySQL避免插入重复记录:唯一性约束 MySQL优化–INSERT ON DUPLICATE UPDATE死锁 ---- 我是蜗牛

    1.5K20

    MySQL RC模式insert update 可能死锁的情况

    涉及的语句为 RC模式下 update根据主键更新和insert 其实这样的问题在RC模式下,要么是简单update问题,要么是insert造成的主键和唯一键检查唯一性时出现问题。...testlll set name='gaopeng1' where id=24;(堵塞) 死锁 锁结构: ---TRANSACTION 322809, ACTIVE 30 sec starting...update TX1:                                                                    TX2: update testlll set...update testlll set name='gaopeng1' where id=22;(堵塞) 死锁 这种情况比较简单不打印出锁结构 情况3 insert insert TX1:                                                     ...                                                            insert into testlll values(26,'gaopeng');(堵塞) 死锁

    1.1K21

    MySQL Update语句是怎么执行的?

    MySQL Update语句是怎么执行的?...[isd2tnp037.png] 昨天,我们利用这张图,了解了一个select语句的执行过程,讲解了连接器、查询缓存、分析器、优化器、执行器等模块的作用,今天我们来看一条update语句是怎么执行的...其实,update语句的执行过程和select语句差不多,但是在update语句执行的过程中,MySQL新增加了两个重要的日志模块,他们分别是redo log(重做日志)和binlog(二进制日志、也可以称之为归档日志...redo log的出现就是为了解决这个问题,redo log既存在于内存中,又存在于磁盘中,当我们update一条记录的时候,Innodb先把记录写在redo log中,然后告诉客户端更新完毕了,但其实...当我们执行一个update的SQL时,MySQL会干如下几件事情: a、执行器查找指定记录,如果记录所在的数据页在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。

    4.5K40

    MySQL】加了什么锁,导致死锁的?

    前言 最近在看 小林coding 的文章,看到一篇《字节面试:加了什么锁,导致死锁的?》...,自己也跟着做了做,题目如下图: 其实基础好的友友们,一眼就能看出会发生死锁,不懂的友友们也不要气馁,听我细细分析; 实验的 MySQL 版本是 8.0.21,; 如果友友们对 MySQL 的锁不太了解...SQL 语句执行之后所加的锁; Time 1 阶段 Time 1 阶段,事务 A 执行以下语句: # 事务 A BEGIN > OK > 时间: 0s update t_student set score...再执行锁查询语句,来看看事务 A 此时加了什么锁导致了阻塞的发生; 可以看到,事务 A 的状态为等待状态(LOCK_STATUS: WAITING),因为向事务 B 生成的间隙锁(范围 (20, 30...本次案例中,事务 A 和事务 B 在执行完后 update 语句后都持有范围为(20, 30)的间隙锁,而接下来的插入操作为了获取到插入意向锁,都在等待对方事务的间隙锁释放,于是就造成了循环等待,满足了死锁的四个条件

    27310

    深入理解MySQL中的UPDATE JOIN语句

    MySQL数据库中,UPDATE语句用于修改表中现有的记录。有时,我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATE JOIN语句。...为了处理历史数据,我们使用了update join语句。 什么是UPDATE JOIN? UPDATE JOIN语句允许我们使用一个表的数据来更新另一个相关联的表的数据。...如果连接条件不正确,可能导致意外的结果或者不完整的更新。 谨慎使用WHERE子句:WHERE子句用于过滤要更新的行。确保WHERE子句的条件是准确的,否则可能影响到不应该更新的行。...总结 在本文中,我们深入探讨了MySQLUPDATE JOIN语句的概念、语法和示例用法。...但是在使用UPDATE JOIN时需要谨慎,确保连接条件和WHERE子句的准确性,以避免意外的结果。希望本文能够帮助你更好地理解和应用UPDATE JOIN语句

    29110

    面试专题:简单写一个导致死锁的程序

    前言 首先简单介绍一下什么是死锁。...死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推荐下去;如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁...面试题 这是一道真实的线程面试题目,要求的写一个导致死锁的程序。...可以看到程序一直在运行中,不终止,并且AAA已获得了lockA,正在等待获取lockB,而BBB已获得了lockB,正在等待获取lockA,很显然,两个线程存在互斥,都在等待不可能获得锁(资源),这就会导致整个程序死锁...如何避免死锁 这其实是另一个问题了,程序开发不可避免会出现死锁的情况,但是在开发中我们要尽量避免。 避免一个线程同时获取多个锁。 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

    19010

    哪些因素导致 MySQL 慢查询

    前言 不管是开发同学还是DBA,想必大家都遇到慢查询(select,update,insert,delete 语句慢),影响业务稳定性。...当我们需要在数据库服务器上恢复一个比较大的实例,而解压缩的过程需要耗费cpu和占用大量io导致数据库实例所在的磁盘io使用率100%,影响MySQL 从磁盘获取数据的速度,导致大量慢查询。...raid 卡重置 当raid卡遇到异常时,进行重置,相当于程序重启,导致系统io hang。此时也导致sql慢。下图是生产中遇到的 RAID卡重置案例。...,并且需要要进行判断会不会由于自己的加入导致死锁,这个时间复杂度O(n),如果有1000个请求,每个线程都要检测自己和其他999个线程是否死锁。...推荐阅读《一次大量删除导致 MySQL 慢查的分析》 五、小结 这里总结了我工作经历中遇到的一部分可能影响SQL执行效率的场景或者案例,经历有限,难免有遗漏的案例/场景,抛砖引玉,欢迎各位有兴趣的读者朋友留言说说你们遇到的场景

    76320
    领券