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

MySQL:锁

按粒度分类

全局锁

  • 含义:全局锁会锁定整个数据库实例,在其生效期间,其他事务无法对数据库进行任何读写操作。常用于数据迁移、数据备份场景。

表级锁

  • 表锁:是对整张表进行锁定的机制。实现逻辑简单,加锁和释放锁速度快,系统负面影响小,能有效避免死锁问题。不过,因其锁定粒度大,锁定资源争用概率高,会降低并发度。MyISAM、MEMORY、CSV 等非事务性存储引擎主要使用表级锁定。
  • 意向锁:属于表级锁,目的是实现多粒度锁机制,允许行锁和表锁共存。分为意向共享锁(IS)和意向排他锁(IX) 。意向共享锁表明事务后续想获取表中某些行的共享锁;意向排他锁则表示事务后续想获取表中某些行的排他锁。意向锁可快速判断表中是否已有记录被加锁,提升加锁效率。
  • 元数据锁:在执行 DML(增删改查)或 DDL(结构变更)操作时,数据库会自动添加。用于保护数据库对象(如表、视图等)的元数据信息,防止在操作过程中,元数据被其他事务修改,保证数据结构的一致性和稳定性。

行级锁

  • 记录锁:锁定单个数据记录。InnoDB 存储引擎中,若表建立时未设置索引,会使用隐式主键进行锁定。
  • 间隙锁:锁定索引记录之间的 “间隙”,防止其他事务在该间隙插入数据。

image.png

  • 临键锁:是记录锁和间隙锁的组合,既锁定当前行,又锁定该行之后的间隙。
  • 插入意向锁:事务在插入数据时会获取,用于表示插入意向。它与其他事务的插入意向锁兼容,不同事务可并发插入数据到同一索引区间,提高插入操作的并发性能。

按行为分类

共享锁

SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;
  • 含义:也叫读锁,允许事务读取数据,但不允许修改。多个事务可同时获取共享锁。
  • 应用场景:适用于多个事务同时读取同一数据的场景,如报表生成、数据统计等操作,多个事务可同时加共享锁读取数据,互不干扰。

排他锁

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
  • 含义:又称写锁,只允许一个事务对特定数据进行读写操作,其他事务无法对该数据加任何类型的锁。
  • 应用场景:用于数据修改操作,如插入、更新、删除等。在进行这些操作前,需先加排他锁,防止其他事务同时修改数据,保证数据修改的原子性和一致性。

按模式分类

悲观锁

  • 策略:一种假设并发冲突总会发生的策略,每次在访问数据前,都会对数据加锁,包括共享锁、排他锁等。
  • 应用场景:在并发冲突概率较高,或对数据一致性要求极高的场景中适用。例如在金融交易系统中,资金转账操作需确保数据准确一致,常使用悲观锁防止并发问题。

乐观锁

  • 策略:假设并发冲突不会发生,不主动加锁。通常通过版本号或时间戳字段实现。在更新数据时,先比较版本号或时间戳,若数据未被其他事务修改,才进行更新操作。
  • 应用场景:适用于并发冲突概率较低的场景,能减少锁的开销,提高系统并发性能。如一些读操作频繁,写操作相对较少且冲突概率低的系统中可使用。

避免死锁

  1. 确保事务访问数据顺序一致:在多个事务并发访问数据时,通过合理加锁,确保事务按特定顺序访问数据,避免因并发操作导致数据不一致。
  2. 合理使用索引:建立合适索引,能让查询更精准,减少锁的范围,避免因索引不当导致锁升级为表锁,进而降低死锁风险
  3. 控制事务大小:使用较小事务,减少事务执行时间和锁持有时间,降低多个事务互相等待锁的可能性,从而避免死锁。
    . 控制事务大小:使用较小事务,减少事务执行时间和锁持有时间,降低多个事务互相等待锁的可能性,从而避免死锁。
  4. 设置锁等待超时时间:通过设置合理的锁等待超时时间,当事务等待锁时间超过该值时自动回滚,打破死锁循环,防止因死锁导致系统长时间无法运行。在 MySQL 中,可通过相关参数配置来设置锁等待超时时间。
http://www.dtcms.com/a/122724.html

相关文章:

  • 秒杀业务的实现过程
  • Java 开发中主流安全框架的详细对比,涵盖 认证、授权、加密、安全策略 等核心功能,帮助开发者根据需求选择合适的方案
  • IP查询能够帮助企业进行数字化转型
  • 医学分割新标杆!双路径PGM-UNet:CNN+Mamba实现病灶毫厘级捕捉
  • UniApp 页面布局自定义头部导航
  • Seq2Seq - CrossEntropyLoss细节讨论
  • 深入理解 Vuex:核心概念、API 详解与最佳实践
  • 网络安全应急响应-启动项和任务计划排查
  • 2. git init
  • 探索生成式AI在游戏开发中的应用——3D角色生成式 AI 实现
  • 华为数字芯片机考2025合集3已校正
  • 今天你学C++了吗?——set
  • 深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(实战部分)
  • 思维森林理论(Cognitive Forest Theory)重构医疗信息系统集群路径探析
  • VectorBT量化入门系列:第三章 VectorBT策略回测基础
  • 【AI News | 20250409】每日AI进展
  • Pyppeteer实战:基于Python的无头浏览器控制新选择
  • React十案例下
  • Java基础第19天-MySQL数据库
  • IT+开发+业务一体化:AI驱动的ITSM解决方案Jira Service Management价值分析(文末免费获取报告)
  • 云轴科技ZStackCTO王为:AI Infra平台具备解决私有化AI全栈难题能力
  • 超便捷超实用的文档处理工具,PDF排序,功能强大,应用广泛,无需下载,在线使用,简单易用快捷!
  • 【JSON2WEB】16 login.html 登录密码加密传输
  • IDEA 调用 Generate 生成 Getter/Setter 快捷键
  • AWS Bedrock生成视频详解:AI视频创作新时代已来临
  • 【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
  • Java常用工具算法-5--哈希算法、加密算法、签名算法关系梳理
  • 蓝桥杯 B3620 x 进制转 10 进制
  • 【蓝桥杯】15届JAVA研究生组F回文字符串
  • STM32单片机入门学习——第29节: [9-5] 串口收发HEX数据包串口收发文本数据包