MySQL 之锁机制

devtools/2024/10/15 20:22:52/

在 MySQL 数据库中,锁机制是保证数据一致性和并发控制的重要手段。不同类型的锁在不同的场景下发挥着关键作用,下面将详细解释 MySQL 中的行锁、GAP 锁(间隙锁)、临键锁的作用和实现原理。

一、行锁

  1. 作用

    • 行锁是对数据库表中的一行数据进行加锁,用于确保在并发事务中对同一行数据的操作是互斥的。行锁可以最大程度地提高并发性能,因为它只锁定了需要操作的数据行,而不会影响其他行的数据。
    • 例如,在一个银行系统中,当一个用户进行转账操作时,需要对转出账户和转入账户的余额进行更新。如果没有行锁,可能会出现两个并发的转账事务同时对同一账户的余额进行更新,导致数据不一致。使用行锁可以确保在一个事务对某一账户余额进行更新时,其他事务不能同时对该账户进行操作,从而保证数据的一致性。
  2. 实现原理

    • MySQL 中的行锁是通过在存储引擎层实现的。不同的存储引擎对行锁的实现方式可能会有所不同。以 InnoDB 存储引擎为例,它使用了一种称为 “意向锁” 的机制来辅助行锁的实现。
    • 意向锁是一种表级锁,它表示事务在某一范围内(如表、页或行)有意向加锁。当事务需要对一行数据加行锁时,首先会在表级别加上意向锁,然后再对该行数据加上行锁。这样可以让数据库系统快速判断是否有其他事务在表级别或更高层次上加了锁,从而避免不必要的锁冲突检测。
    • 当一个事务对一行数据加行锁时,其他事务如果也需要对同一行数据进行操作,就必须等待该事务释放行锁。只有当行锁被释放后,其他事务才能获取该行数据的锁并进行操作。

二、GAP 锁(间隙锁)

  1. 作用

    • GAP 锁主要用于防止幻读现象的发生。幻读是指在一个事务中,两次查询同一范围的数据,第二次查询结果中出现了第一次查询中没有的数据行,这通常是由于其他事务在两次查询之间插入了新的数据行导致的。
    • GAP 锁通过锁定数据行之间的间隙,防止其他事务在这个间隙中插入新的数据行,从而避免幻读的发生。例如,在一个订单管理系统中,一个事务需要查询订单编号在 100 到 200 之间的订单。如果没有 GAP 锁,另一个事务可能在这个范围内插入一个新的订单,导致第一个事务在第二次查询时出现幻读。使用 GAP 锁可以锁定这个范围内的间隙,防止其他事务插入新的订单,从而避免幻读。
  2. 实现原理

    • InnoDB 存储引擎在可重复读隔离级别下会自动使用 GAP 锁。当一个事务对一个范围的数据进行查询时,InnoDB 会在这个范围内的数据行上加上共享锁,同时在数据行之间的间隙上加上 GAP 锁。
    • GAP 锁是一种区间锁,它锁定的是一个数据行之间的间隙,而不是具体的数据行。例如,如果一个事务对订单编号在 100 到 200 之间的订单进行查询,InnoDB 会在订单编号为 100 的数据行上加上共享锁,在订单编号为 200 的数据行上也加上共享锁,同时在 100 和 200 之间的间隙上加上 GAP 锁。
    • 当其他事务试图在这个间隙中插入新的数据行时,会被 GAP 锁阻塞,直到持有 GAP 锁的事务提交或回滚,释放了 GAP 锁,其他事务才能插入新的数据行。

三、临键锁(Next-Key Lock)

  1. 作用

    • 临键锁是一种组合锁,它由行锁和 GAP 锁组成。临键锁既可以防止其他事务对同一行数据进行修改,又可以防止其他事务在该行数据的前后间隙中插入新的数据行,从而有效地避免了幻读现象的发生。
    • 例如,在一个库存管理系统中,一个事务需要查询库存数量在 100 到 200 之间的商品。如果使用临键锁,InnoDB 会在这个范围内的每个商品数据行上加上行锁,同时在数据行之间的间隙上加上 GAP 锁。这样可以确保在这个事务执行期间,其他事务既不能修改这个范围内的商品数据行,也不能在这个范围内插入新的商品数据行,从而避免了幻读。
  2. 实现原理

    • 临键锁是 InnoDB 存储引擎在可重复读隔离级别下默认使用的锁机制。当一个事务对一个范围的数据进行查询或更新时,InnoDB 会自动为这个范围内的每个数据行加上行锁,同时在数据行之间的间隙上加上 GAP 锁,从而形成临键锁。
    • 临键锁的实现是通过在索引树上进行加锁来实现的。InnoDB 存储引擎使用 B + 树作为索引结构,当一个事务对一个范围的数据进行查询或更新时,InnoDB 会在索引树上找到这个范围的数据行,并在这些数据行对应的节点上加上行锁和 GAP 锁。
    • 当其他事务试图对这个范围内的数据行进行修改或在这个范围内插入新的数据行时,会被临键锁阻塞,直到持有临键锁的事务提交或回滚,释放了临键锁,其他事务才能进行操作。

总之,MySQL 中的锁机制是一个复杂而重要的主题。行锁、GAP 锁和临键锁在不同的场景下发挥着不同的作用,它们共同保证了 MySQL 数据库在并发环境下的数据一致性和事务隔离性。理解这些锁的作用和实现原理,对于优化数据库性能、避免死锁和提高系统的可靠性都具有重要意义。


http://www.ppmy.cn/devtools/126332.html

相关文章

新品发布!超小型伺服一体机火热预售中!PMM28系列一体化伺服电机

随着驱控一体化电机的不断发展和深入,自动化产品正以前所未有的广度和深度渗透到生产生活的各个领域。其中的小型一体化电机,如28步进、35步进等,由于其小巧的体积,自面向市场以来就受到广泛用户的喜爱,经常在实验仪器…

Chromium 中HTML5 WebSocket实现分析c++(一)

一、WebSocket前端接口定义: WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API。 使用 WebSocket() 构造函数来构造一个 WebSocket。 构造函数 WebSocket(url[, protocols]) 返回一个 WebSocket 对象。 …

基于yolov8、yolov5的烟雾检测系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

【python】__call__,__new__,__init__

call()、new() 和 init() 是 Python 中常用的特殊方法,它们在对象的创建和使用过程中发挥着不同的作用。 1. call() 方法 功能: __call__() 是用来让一个类的实例像函数一样调用的。当定义了 __call__() 方法后,类的实例可以被当作函数来使…

mac os使用uniapp官网cli创建项目后,hbuilderx运行失败

这个故障发生前提是,m芯片的macos,采用arm64架构 npm i安装依赖的时候只安装了 esbuild/darwin-arm64rollup/rollup-darwin-arm64 但是hbx运行时会使用到 esbuild/darwin-x64rollup/rollup-darwin-x64 所以我们需要单独安装一下这两个依赖&#xff…

密码加密存储方案

在密码加密存储中,常用的方案包括 MD5、SHA-256 等哈希算法,同时结合一些额外的技术如加盐(Salt)和多次哈希来提高安全性。下面逐步介绍常见的密码加密存储方案、算法之间的区别、以及如何安全存储密码。 1. 基本的哈希算法&…

【含文档】基于Springboot+Vue的案件管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于ECS和NAS搭建个人网盘

前言 在数字化时代,数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累,使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备(如硬盘、U盘)虽然方便,但存在易丢失、损坏和数据…