mysql行锁等待异常

author author     2023-04-24     650

关键词:

生产环境的Innodb_row_lock_current_waits参数一直是6,查看processlist和innodb_trx中均未发现有锁等待的情况,这是怎么回事

根据我之前接触到的此类问题,大致可以分为以下几种原因:
1. 程序中非数据库交互操作导致事务挂起
将接口调用或者文件操作等这一类非数据库交互操作嵌入在 SQL 事务代码之中,那么整个事务很有可能因此挂起(接口不通等待超时或是上传下载大附件)。
2. 事务中包含性能较差的查询 SQL
事务中存在慢查询,导致同一个事务中的其他 DML 无法及时释放占用的行锁,引起行锁等待。
3. 单个事务中包含大量 SQL
通常是由于在事务代码中加入 for 循环导致,虽然单个 SQL 运行很快,但是 SQL 数量一大,事务就会很慢。
4. 级联更新 SQL 执行时间较久
这类 SQL 容易让人产生错觉,例如:update A set ... where ...in (select B) 这类级联更新,不仅会占用 A 表上的行锁,也会占用 B 表上的行锁,当 SQL 执行较久时,很容易引起 B 表上的行锁等待。
5. 磁盘问题导致的事务挂起
极少出现的情形,比如存储突然离线,SQL 执行会卡在内核调用磁盘的步骤上,一直等待,事务无法提交。
综上可以看出,如果事务长时间未提交,且事务中包含了 DML 操作,那么就有可能产生行锁等待,引起报错。
参考技术A 锁等待..不一定就是锁表了..你这个是行级锁...追问

请问如何获取这6个行级锁的信息?

追答

show engine innodb status\G 里面内容很多..仔细找下...一般for update就是在等锁中

追问

看过了,没有for update状态

追答

看一下TRANSACTION 或者SSION里面的内容....不一定非得是for updare

追问

都看了,都是cleaning up。information下的innodb_lock_waits和innodb_locks都为空。数据库版本是5.6.10.

追答

5.6的啊? 5.6的没研究过不知道是不是有改善...
其实一般情况下锁等待很正常..mysql的行级锁其实很烦躁...那就看下慢查询..会不会有 for update?
曾经遇到过..因为开发的sql语句问题..导致一直锁着..

追问

慢日志我每周都看的,没有。关键是这个6个行锁,至少Innodb_row_lock_current_waits参数反映的,存在了个把月了,感觉不把这个坑填了,以后还会掉进去

追答

吧你的show engine innodb status\G贴出来看下...

mysql存储过程出现锁表锁行的情况怎么解决

行锁的等待在介绍如何解决行锁等待问题前,先简单介绍下这类问题产生的原因。产生原因简述:当多个事务同时去操作(增删改)某一行数据的时候,MySQL为了维护ACID特性,就会用锁的形式来防止多个事务同时操作某一行数据... 查看详情

从头开始搞懂mysql(05)行锁表锁全局锁(代码片段)

1、行锁行锁是针对数据表中行记录的锁,MySQL的行锁是在引擎层实现的,并不是所有的引擎都支持行锁,比如MyISAM就不支持,InnoDB支持行锁,避免了并发控制时使用表锁1.1两阶段锁在InnoDB事务中,行锁是在... 查看详情

mysql悲观锁是行锁还是表锁?(代码片段)

mysql悲观锁是行锁还是表锁?结论悲观锁在非主键、非索引时是表锁,在主键、索引时是行锁。使用悲观锁在查询语句后面加上forupdate开启悲观锁。select*fromtablewherecol=xxforupdate;悲观锁:在事务执行开始加锁,此... 查看详情

mysql悲观锁是行锁还是表锁?(代码片段)

mysql悲观锁是行锁还是表锁?结论悲观锁在非主键、非索引时是表锁,在主键、索引时是行锁。使用悲观锁在查询语句后面加上forupdate开启悲观锁。select*fromtablewherecol=xxforupdate;悲观锁:在事务执行开始加锁,此... 查看详情

mysql巡检查看参数

...lock_current_waits当前等待的待锁定的行数Innodb_row_lock_waits一行锁定必须等待的总时长Table_locks_waited表锁等待次数mysql锁监控表级锁Table_locks_waitedTable_locks_immediate行级锁Innodb_row_lock_current_waits当前等待锁的行锁数量Innodb_r 查看详情

mysql行锁

MySQL行锁场景两阶段锁思考死锁和死锁检测出现死锁后,有两种策略:思考热点数据性能问题小结问题汇总场景行锁是针对数据表中行记录的锁,MySQL行锁是引擎层实现的,不是所有的引擎都支持行锁,MyISAM引... 查看详情

mysql行锁

MySQL行锁场景两阶段锁思考死锁和死锁检测出现死锁后,有两种策略:思考热点数据性能问题小结问题汇总场景行锁是针对数据表中行记录的锁,MySQL行锁是引擎层实现的,不是所有的引擎都支持行锁,MyISAM引... 查看详情

面试题2:mysql的行锁

mysql的锁是由具体的存储引擎实现的。InnoDB支持行锁和事务Mysql有三种级别的锁定:表级锁定、页级锁定、行级锁定  查看详情

mysql事务没有提交导致锁等待lockwaittimeoutexceeded异常

异常:Lockwaittimeoutexceeded;tryrestartingtransaction解决办法:(需要数据库最高权限)执行select*frominformation_schema.innodb_trx之后找到了一个一直没有提交的只读事务,找到对应的线程后,执行killthreadid,再确认一直没有提交的只读事物被干... 查看详情

innodb快速定位行锁争用会话的过程和操作

...时的问题,虽然根因不是资源争用导致的,但是行锁争用,导致会话hang是一个很常见的场景。借鉴叶老师的公众号"老叶茶馆"的一篇文章《InnoDB如何快速杀掉堵塞会话的思考》,了解一下MySQL中快速定位行锁... 查看详情

day871.行锁-mysql实战(代码片段)

行锁Hi,我是阿昌,今天学习记录的是关于行锁的内容。MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对... 查看详情

行锁页面锁与表锁(代码片段)

按锁定粒度:表锁、页面锁、行锁存储引擎支持情况: 在具体说明之前得明白什么是死锁,什么是锁冲突死锁:多个进程互相等待对方锁的释放锁冲突:一个进程等待另一个进程释放需要的锁  行锁粒度小,开销大,... 查看详情

Mysql 表锁代替行锁

】Mysql表锁代替行锁【英文标题】:Mysqltablelockinsteadofrowlocks【发布时间】:2013-12-0205:23:35【问题描述】:Mysql(5.5)Innodb在这种情况下是放置表锁而不是行锁。这会导致对表的其他插入查询失败。这也是更大交易的一部分。Insertintot... 查看详情

mysql事务没有提交导致锁等待lockwaittimeoutexceeded异常的处理办法

java.lang.Exception:###Errorupdatingdatabase. Cause:java.sql.SQLException:Lockwaittimeoutexceeded;tryrestartingtransaction###TheerrormayinvolvedefaultParameterMap###Theerroroccurredwhilesettingparamet 查看详情

mysql数据库表锁行锁

mysql有2种常见的锁:表锁和行锁一、表锁1)读锁假如当前有2个session,session1获得表table的读锁,对表table进行查询,并尚未释放读锁,因为读锁是读共享锁,所以此时session2也是可以对table进行读操作。... 查看详情

mysql中innodb的行锁算法

参考技术A众所周知,innodb是默认行锁,当然也支持表锁。如下是对于行锁的算法进行的一些实验。锁的算法为:我知道是行锁,但是是如何锁的,锁多少数据假如有个索引是:[1,2,3,7]recordlock锁的是1,2,3,7gaplock锁的是(-,... 查看详情

(25)行锁实现

参考技术A行锁在InnoDB中基于索引实现,如加锁没用索引,退化为表锁概要:2相同索引,访问不同行,锁冲突        3多索引,不同索引锁定不同行      4小表或数据转换,可能... 查看详情

mysql的行锁

...45讲》这本书,当时看完了MySQL的全局锁、表级锁还有行锁和间隙锁。其中的行锁和间隙锁迟迟无法理解,最近趁着有空再次阅读了一遍,并且对照了《深入浅出MySQL》,发现对MySQL锁的理解又上了一个台阶,今... 查看详情