0

0

一起聊聊Mysql两阶段锁和死锁

藏色散人

藏色散人

发布时间:2022-12-05 15:55:17

|

2374人浏览过

|

来源于learnku

转载

本篇文章给大家带来了关于mysql锁的相关知识,其中主要介绍了mysql 两阶段锁和死锁,下面一起来看一下,希望对大家有帮助。

两阶段锁

概念

讲的是InnoDB如何处理行锁的上锁,释放锁的行为。

事务使用过程中,对记录以主键为条件删改时,会立刻加上排他锁,这完成了上锁阶段。

当删改动作完成后,这个锁并不会立即释放,需要等至事务提交时,才会释放锁

引发的问题-阻塞

事务 A 事务 B
begin;
update t set k=k+1 where id=1;
update t set k=k+1 where id=2;


begin;
update t set k=k+2 where id=1;
commit;

根据两阶段锁协议,事务 B将会因为id=1的数据被事务 A上了锁,而阻塞,因为事务 B需要拿到锁后才能进行下一步操作。

上述这个问题,可能看似问题不大,但是如果不止是事务 B,还有事务 C事务 D,等等很多,做的是跟事务 B一样的事,问题就大了,被阻塞的线程就会多了起来。【推荐学习:MySQL视频教程

如何处理上述问题

我们应该尽量将可能会引起阻塞的语句,放到事务的最后面操作,例如上述事务 A例子中的id=1的语句,它和第二句的执行并没有什么关联关系,可是它是容易引起阻塞的语句,因为在事务 B中也要对这一行数据做锁操作(在各类事务中频繁使用的,如公司的收付款账号余额记录,即**热点行**),但是却在事务一开始就拿到锁了。

本质上,是缩短了拿锁时间和释放锁之间的时间。即持有锁的时间缩短,以此减少锁引起的阻塞。

死锁

概念

两个线程,互相在等待对方释放资源。

在两个事务A,B中。

  • 事务 A拿到了资源 A的锁。

  • 事务 B拿到了资源 B的锁。

  • 事务 A去拿资源 B的锁。

  • 事务 B去拿资源 A的锁。

    Khroma
    Khroma

    AI调色盘生成工具

    下载

很明显,步骤 3,4中,事务 A,B 都想去拿锁,但是又都拿不到,因为对方都还没有释放该资源的锁。这种现象就是死锁。

引发的问题-死锁

InnoDB中,有一个拿锁的等待时间配置,超过这个时间就会抛出异常,这个时间默认是50秒。通常来说,有一个接口需要50秒后才响应是不可接受的。innodb_lock_wait_timeout

那是不是把这个配置时间设置短一点就行了?比如1秒?

应该是不可以的,因为可能会影响到你的正常业务,或许你的业务导致你的事务执行时间本身就比较长,超过1秒。超出这个时间会抛出异常,你的正常业务就被影响了。

那该如何处理上述问题

InnoDB中,还有一个自动检测死锁并处理的配置。它是默认开启的,在极端情况下,虽然能处理问题,但是对CPU消耗特别大。

它原理是在事务中即将要上锁的时候,会去检测其他并发线程,有没有将此资源锁住,如果检测到某个线程A有,然后再会去检测线程A的依赖有没有被其他并发线程锁住,如此循环往复,最终判断这些锁会不会形成死锁。

可以看出,线程越多,检测成本就越大。innodb_deadlock_detect

仅代表个人当前的学习做出的对此问题的处理和总结:

1.关闭死锁检测,将拿锁时间配置缩短至预估的最高时间,通常不会超过15秒,超过15秒后,需要有重试机制。

2.开启死锁检测,在应用层控制并发连接数,使用连接池控制Mysql的连接数,在服务层限制Mysql最大连接数。

以上是对怎样减少行锁性能影响的学习总结。

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

33

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

47

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 799人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号