MySQL行锁的优劣剖析:怎样降低行锁对性能的阻碍?

《MySQL行锁的利弊剖析:如何降低行锁对性能的消极影响》

行锁是针对数据表中行记录实施的锁定机制,由引擎层的相关引擎予以实现。

从两阶段锁说起

在InnoDB的事务场景下,行锁并非在需要时立即获取后就马上释放,而是要等到事务结束才会释放,此即为两阶段锁协议

明确这一设定后,若事务需锁定多个行,需将最易引发锁冲突、最可能影响并发程度的锁尽量后置

举个例子,存在电影票交易业务,顾客A要在影院B购买电影票,涉及如下操作:

  • 从顾客A的账户余额中扣减电影票的费用;

  • 向影院B的账户余额中增加电影票的费用;

  • 记录一条交易的日志。

这三个操作对应三条语句,为保证原子性,会将其置于同一个事务中。观察可知,语句2最易产生冲突,因为不同顾客买票时都会通过语句2修改同一行数据。

依据两阶段锁协议,锁等待难以避免,而将语句2安排在最后,例如按312的顺序执行,就能让最易引发锁冲突的锁处于后面位置,最大程度减少事务间的等待情况。

死锁与死锁检测

当并发系统中不同线程出现循环的资源依赖情形,相关线程都在等待其他线程释放资源时,会致使这些线程陷入无限等待状态,此状况被称为死锁。

以行锁为例:

MySQL行锁的优劣剖析:怎样降低行锁对性能的阻碍?

此时,事务A等待事务B释放id=2的行锁,事务B等待事务A释放id=1的行锁,从而造成死锁。

出现死锁时,有两种应对策略:

  • 直接进入等待状态,直至超时。该超时时间可通过参数innodb_lock_wait_timeout进行设置。在InnoDB中,默认值为50秒,这通常难以接受。但也不能将该时间设置得过小,否则无法区分死锁与简单锁等待情况,易造成误判。所以,此方法一般不被采用。

  • 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一事务,使其他事务能够继续执行。设置参数innode_deadlock_detect=on,表示开启该逻辑。

正常情况下采用第二种策略,但死锁检测也有一定负担。若n个事务都要更新同一行,由于每个新被阻塞的线程都需判断自身是否引发死锁,其复杂度为O(n),总复杂度会达到O(n²)

针对这种热点行更新导致的性能问题,主要思路如下:

  • 对于相同行的更新操作,在进入引擎前进行排队。如此,InnoDB内部就不会有大量死锁检测工作。

  • 将一行数据拆分为逻辑上的多行以减少锁冲突。比如将影院账户拆成10个记录,每次增加金额时随机选取其中一条记录进行操作,每次冲突概率变为原来的1/10,可减少锁等待次数,进而降低死锁检测的CPU消耗。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13063.html

(0)
LomuLomu
上一篇 2025 年 8 月 5 日
下一篇 2025 年 8 月 5 日

相关推荐

  • 三步搞定2025idea激活码,配套全新破解教程

    声明:以下激活补丁与序列号均搜集自互联网,仅供学习交流,禁止商业用途;如条件允许,请支持正版 JetBrains 全家桶。若侵权,请邮件联系作者删除。 先放一张实测图:IDEA 2025.2.1 已顺利激活至 2099 年,稳得一批! 下面用图文方式,手把手带你完成最新版 IntelliJ IDEA 的激活流程。 嫌折腾?官方正版全家桶账号低至 32 元/年…

    IDEA破解教程 2025 年 10 月 23 日
    10200
  • 2024 WebStorm最新激活码,WebStorm永久免费激活码2025-02-09 更新

    WebStorm 2024最新激活码 以下是最新的WebStorm激活码,更新时间:2025-02-09 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 WebStorm 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 …

    2025 年 2 月 9 日
    69800
  • CLion破解后插件还能更新吗?附测试结果!

    免责声明:以下激活补丁、授权码均源自网络公开分享,仅供个人学习研究,禁止任何商业用途。若条件允许,请支持正版! CLion 是 JetBrains 家族专为 C/C++ 打造的跨平台 IDE,Windows、macOS、Linux 全支持。下面手把手教你用破解补丁实现“永久授权”,一次性解锁全部高级特性。 无论你现在用的是哪个版本、哪种系统,都给你准备好了。…

    2025 年 9 月 19 日
    12700
  • 2025年最新PyCharm激活码及永久破解教程(支持2099年)

    本方法适用于JetBrains全家桶,包括PyCharm、IDEA、DataGrip、Goland等开发工具! 先给大家展示最新PyCharm版本成功破解的截图,可以看到已经完美激活到2099年,非常稳定! 下面我将通过详细的图文步骤,手把手教你如何将PyCharm激活至2099年。 这个方法不仅适用于最新版本,对之前的旧版本同样有效! 支持Windows/…

    PyCharm激活码 2025 年 7 月 20 日
    48100
  • Redis Java 集成到 Spring Boot

    Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Redis 📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 Redis Java 集成到 Spring Boot 一、使用 Spring Boot 连接 Redis 单机 1.创…

    2025 年 1 月 1 日
    44400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信