当前位置:首页 > 数据库 > 正文

mysql的1292解决办法?如何彻底解决Deadlock问题?

mysql的1292解决办法?如何彻底解决Deadlock问题?

mysql锁例 MySQL锁例分析及解决:例描述:在MySQL 7环境下,设置数据库隔离级别为REPEATABLEREAD,创建了一个包含主键id和非唯一索引age的u...

mysql锁例

MySQL锁例分析及解决:例描述:在MySQL 7环境下,设置数据库隔离级别为REPEATABLEREAD,创建了一个包含主键id和非唯一索引age的ur表,并插入了两条数据。事务A和事务B分别了相同的UPDATE语句,随后都尝试进行INSERT操作。

具体而言,当一个事务删除操作时,会 row_update_for_mysql,进而获取记录的 X record lock。插入操作同样会获取 X record lock,大部分情况下,初始会获取隐式锁,随后在检测冲突时,才会转换为 X lock。在分析锁例时,我们关注事务在记录上的锁状态。

在我们的例中,一条INSERT语句在遇到唯一二级索引重复时,会添加S型或X型next-key锁,而带有on duplicate key update的语句会添加X锁。这就可能导致锁,当两个事务尝试对同一数据分别进行读写操作时,形成相互等待的锁状态。

实际例中,当两个事务并发插入相同唯一值时,虽然理论上会获取行锁,但由于gap锁的介入,可能导致锁。这需要对锁的加锁逻辑有深入理解,特别是inrt操作的锁策略。避免锁的方法:优化SQL查询:确保查询高效且不会不必要地锁定过多资源。

此外,在事务阶段,还有几种可能导致事务提交延迟的情况,例如锁等待、IO问题、Buffer问题和落盘延迟。当面对Update更新慢的问题时,可以遵循以下排查思路:查看实例性能情况、检查MySQL状态、分析SQL语句、分析应用程序SQL慢的时间、使用包及strace进行分析。

使用主键更新列;更新时where中有主键时,innodb会自动选用PRIMARY索引,而非索引合并。 (不推荐)where中的单列索引条件筛选出的结果数很少,比如唯一索引; (不推荐)关闭优化器的index merge优化。

最新文章