当前位置: 首页 > news >正文

MySQL锁机制的介绍

	在MySQL中,锁是用于控制对数据库对象的并发访问的一种重要机制。锁的用法可
以从多个维度进行详细描述,包括锁的类型、锁的粒度、锁的应用场景以及锁的具体使
用方式等。

一、锁的类型

MySQL中的锁可以从多个角度进行分类,常见的分类方式包括:

按模式分类:

乐观锁:假设在多数情况下,多个事务不会同时修改同一份数据。在读取数据时不会立即加锁,而是在更新数据时检查是否有其他事务同时修改了数据。如果检测到冲突,则通过回滚事务来解决。适用于读多写少的场景。
悲观锁:假设在多数情况下,多个事务会同时修改同一份数据。在读取数据时立即加锁,以阻止其他事务同时修改。适用于写多读少的场景。

按粒度分类:

全局锁:锁定数据库中的所有表,用于全库的逻辑备份等操作。
表级锁:每次操作锁住整张表,开销小、加锁快,但并发度低。
行级锁:每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,并发度最高,但开销大、加锁慢,且容易发生死锁。
页面锁(较少见):锁定粒度介于表锁和行锁之间,适用于某些特定的存储引擎。

按属性分类:

共享锁(S锁):允许多个事务同时读取同一份数据,但在任何时刻只允许一个事务修改数据。
排他锁(X锁):只允许一个事务独占访问数据,其他事务无法同时读取或修改数据。

二、锁的具体使用方式

全局锁:
使用FLUSH TABLES WITH READ LOCK命令来获取全局锁,用于全库的逻辑备份。加锁后,整个数据库实例处于只读状态,后续的DML(数据操作语言)写语句、DDL(数据定义语言)语句以及更新操作的事务提交语句都将被阻塞。
表级锁:
使用LOCK TABLES语句来获取表锁。例如,LOCK TABLES table_name READ;为表加读锁,LOCK TABLES table_name WRITE;为表加写锁。读锁不会阻塞其他客户端的读操作,但会阻塞写操作;写锁既会阻塞其他客户端的读操作,也会阻塞写操作。
行级锁:
在InnoDB存储引擎中,行级锁是通过对索引上的索引项加锁来实现的。通过SELECT … FOR UPDATE语句可以为指定的行加排他锁,通过SELECT … LOCK IN SHARE MODE语句可以为指定的行加共享锁。
乐观锁:
乐观锁的实现通常不是依赖数据库本身的锁机制,而是通过应用程序的逻辑来实现。例如,可以在数据库表中添加一个版本号字段,每次更新数据时,将该字段的值加一。在更新前,先检查该字段的值是否与预期一致,如果一致则进行更新,否则认为数据已被其他事务修改,操作失败。

三、锁的注意事项

死锁:当多个事务相互等待对方释放锁时,会形成死锁。为了防止死锁,可以设置锁的等待超时时间,或者使用锁提示(lock hints)来指定锁类型和粒度。
锁的粒度:选择合适的锁粒度是提高并发性能的关键。一般来说,锁粒度越小,并发度越高,但开销也越大;锁粒度越大,开销越小,但并发度也越低。
事务隔离级别:MySQL支持不同的事务隔离级别,包括读未提交、读已提交、可重复读和串行化。不同的隔离级别对应不同的锁类型和粒度,需要根据业务需求选择合适的隔离级别。
及时释放锁:在事务结束后要及时释放锁,以避免锁定资源过长时间,影响其他事务的执行。


http://www.mrgr.cn/news/16663.html

相关文章:

  • 推理引擎测试-算力共享:test_inference_engine
  • 消息中间件:深入理解 Kafka的消息顺序和一致性、可靠性和高可用性 第1版
  • X86架构(六)——硬盘访问与控制
  • 【百日算法计划】:每日一题,见证成长(006)
  • 客流预测 | 基于Transformer下车站点客流推断研究(Matlab)
  • RK3568笔记五十八:基于SIP的视频通话测试
  • Multi-UAV|多无人机、多场景路径规划MATLAB
  • nuxt3模拟手机验证码
  • 大模型好书案例——《BERT基础教程:Transformer大模型实战》(附PDF)
  • HarmonyOS应用开发者基础认证 | <HarmonyOS第一课>习题-ArkTS语法
  • LTspice 的简单使用【软件使用学习】
  • 如何在JPG文件中隐写数据
  • Day52 | dijkstra(堆优化版)Bellman_ford 算法
  • 【STM32H743】将全局变量定义到指定内存MDK
  • PE文件结构详解(非常详细)
  • 【QT线程学习】
  • 【时间盒子】-【1.序言】高效人士都在用的时间管理方法。我是如何通过鸿蒙元服务APP实现?
  • 火爆全网的扩散模型(Diffusion Model)到底是什么?只看这篇就够了!绝对通俗易懂!草履虫看完都要点头!| 附完整代码 + 详细注释
  • 2024年软考科目大调整:考试安排、频次变动全解析
  • YOLOv8改进 | 主干篇 | YOLOv8引入EfficientViT替换Backbone