MySQL学习笔记-死锁和死锁检测

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL学习笔记-死锁和死锁检测

InnoDB 引擎相比于 MyISAM 引擎,有一个优点就是 InnoDB 引擎支持行锁,而 MyISAM 引擎在做并发控制时只能使用表锁,这篇文章学习一下 InnoDB 引擎中死锁是如何产生的。

1.笔记图

2.行锁说明


  • 行锁就是针对数据表中行记录的锁
  • MySQL 行锁是在引擎层自己实现的
  • InnoDB 支持行锁,MyISAM 引擎不支持行锁,这也是 MyISAMInnoDB 区别之一

3.两阶段锁协议

Tips:事务 Bupdate 语句会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能继续执行。

  • InnoDB 事务中,行锁是在需要的时候才加上的,要等到事务结束时才释放,这个就是两阶段锁协议
  • 如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,可以最大程度地减少了事务之间的锁等待,提升了并发度

4.死锁和死锁检测

  • 死锁

  • 并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁
  • 事务 A 在等待事务 B 释放 id=2 的行锁,而事务 B 在等待事务 A 释放 id=1 的行锁
  • 事务 A 和事务 B 在互相等待对方的资源释放,就是进入了死锁状态
  • 死锁检测
  • innodb_deadlock_detect:默认是 on
  • 并发场景每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,要消耗大量的 CPU 资源,但是每秒执行的事务数很少

5.死锁检测优化思路

  • 如果能确保业务一定不会出现死锁,可以临时把死锁检测关掉
  • 数据库服务端做并发控制,可以考虑在中间件实现,也可以修改 MySQL 源码在数据进入引擎之前排队,这样在 InnoDB 中就不会有大量的死锁检测消耗 CPU
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
21 2
|
25天前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
|
25天前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
|
25天前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
|
1月前
|
弹性计算 关系型数据库 MySQL
检测MySQL 服务是否存活
【4月更文挑战第29天】
13 0
|
1月前
|
弹性计算 关系型数据库 MySQL
检测MySQL 数据库连接数量
【4月更文挑战第29天】
11 0
|
1月前
|
弹性计算 关系型数据库 MySQL
检测 MySQL 服务是否存活
【4月更文挑战第28天】
13 0
|
1月前
|
弹性计算 关系型数据库 MySQL
检测 MySQL 数据库连接数量
【4月更文挑战第28天】
16 0
|
1月前
|
存储 监控 关系型数据库
【MySQL】InnoDB 什么情况下会产生死锁
【MySQL】InnoDB 什么情况下会产生死锁
|
1月前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
33 1

推荐镜像

更多