首页 > 数据库 >Mysql锁

Mysql锁

时间:2024-12-27 17:23:26浏览次数:6  
标签:事务 间隙 Lock 记录 插入 Mysql 锁定

Mysql锁

行锁

InnoDB存储引擎中的行锁机制是通过多种类型的锁来实现的,以确保事务的隔离性和并发性。以下是InnoDB中主要的行锁类型:

  1. 记录锁(Record Lock)

    • 记录锁是最基本的行锁形式,它锁定索引记录。例如,如果你对某个主键执行SELECT ... FOR UPDATEUPDATE操作,那么你将获得该主键对应的索引记录上的记录锁。
  2. 间隙锁(Gap Lock)

    • 间隙锁锁定的是索引记录之间的“间隙”,或者是第一条记录之前、最后一条记录之后的范围。它的目的是防止其他事务插入新的记录到这个间隙中,从而避免幻读的问题。间隙锁不会锁定任何实际的行,而是锁定可能插入新行的位置。
  3. 临键锁(Next-Key Lock)

    • 临键锁是记录锁和间隙锁的结合体。它不仅锁定索引记录本身,同时也锁定了该记录之前的间隙。这意味着临键锁可以阻止其他事务在锁定的记录位置插入新的记录。这是InnoDB默认使用的锁类型,在可重复读(REPEATABLE READ)隔离级别下,为了防止幻读而采用。
  4. 插入意向锁(Insert Intention Gap Lock)

    • 插入意向锁是一种特殊的间隙锁,当一个事务打算在一个特定的间隙中插入一行时,会申请这种锁。这是一种非阻塞锁,即多个事务可以在同一间隙上持有插入意向锁,只要它们插入的数据不冲突即可。如果另一个事务已经持有了覆盖该间隙的间隙锁或临键锁,则插入意向锁会被阻塞。
  5. 自增锁(Auto-inc Lock)

    • 这种锁是在插入包含AUTO_INCREMENT列的表时使用。它是表级别的锁,但在某些情况下(如批量插入),它可以减少锁定的时间。
  6. 外键检查锁(Foreign Key Check Locks)

    • 在涉及外键约束的操作中,InnoDB会使用这类锁来确保参照完整性。这些锁通常与记录锁相关联,并且在执行涉及外键关系的INSERT、DELETE或UPDATE操作时自动处理。

了解这些不同的锁类型对于优化应用程序性能和正确设置事务隔离级别非常重要。合理设计数据库模式和选择适当的查询策略可以帮助最小化锁定冲突,提高系统的并发处理能力。

表锁

表锁(Table Lock)是在整个表级别上进行锁定,以控制对表的并发访问。在不同的数据库系统中,表锁的类型和实现方式可能会有所不同。对于MySQL中的InnoDB存储引擎,主要涉及以下几种类型的表锁:

1. 读表锁(Read Table Lock)

  • 描述:允许事务读取整个表的数据,但不允许其他事务对该表进行写操作(插入、更新或删除)。多个事务可以同时持有读表锁,因此它们可以并发地读取表数据。
  • 应用场景:适用于那些需要确保表内容在读取期间不会被修改的场景。

2. 写表锁(Write Table Lock)

  • 描述:独占性的锁,不仅阻止其他事务读取该表,还阻止它们对该表进行任何写操作。这意味着在一个事务持有写表锁时,其他所有试图访问该表的事务都将被阻塞,直到当前事务释放锁。
  • 应用场景:适用于那些需要完全排他访问表来进行大量写入操作的场景,如批量更新或结构变更(例如添加或删除列)。

3. 意向锁(Intention Locks)

在意向锁中,又分为意向共享锁(Intention Shared Lock, IS)和意向排他锁(Intention Exclusive Lock, IX),它们并不是直接作用于表上的锁,而是用来表明一个事务打算在表中的某些行上加S锁或X锁。这些锁是为了解决多粒度锁定(Multi-granularity locking)的问题,使得在检查表级锁时不需要遍历所有的行锁。

  • 意向共享锁(IS):表示事务打算对表中的某些行加S锁。
  • 意向排他锁(IX):表示事务打算对表中的某些行加X锁。

4. 元数据锁(Metadata Lock, MDL)

  • 描述:这是MySQL服务器层面上的一种锁机制,用于管理对表结构的访问。MDL确保在表结构发生改变时(如DDL操作),不会与正在进行的DML操作冲突。它还可以防止在同一时间对同一张表执行相互冲突的操作。
  • 应用场景:当执行DDL语句(如ALTER TABLE)或者查询语句(如SELECT)时,MySQL会自动获取相应的MDL。

总结

在MySQL的InnoDB存储引擎中,表锁主要用于控制对表的整体访问,尤其是在需要进行大规模读写操作或表结构变更时。意向锁则是一种辅助机制,帮助协调行级锁和表级锁之间的关系。而元数据锁(MDL)则是MySQL服务器层面提供的锁,用于保证表定义的一致性,并防止DDL和DML操作之间的冲突。

理解这些不同类型的表锁及其应用场景有助于优化数据库性能,避免不必要的锁定冲突,以及设计更高效的应用程序逻辑。在高并发环境下,合理使用锁机制可以显著提升系统的稳定性和响应速度。

标签:事务,间隙,Lock,记录,插入,Mysql,锁定
From: https://www.cnblogs.com/firsthelloworld/p/18636266

相关文章

  • Python作业有效性评价系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍通过开发人员和系统使用方的沟通,本系统的用户主要有如下几类,教师和学生。(1)教师子系......
  • MySQL 备份和恢复
    1.备份恢复概述1.1为什么要备份灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景参考链接:https://www.toutiao.com/a6939518201961251359/1.2备份类型完全备份,部分备份完全备份:整个数据集部分备份:只备份数据子集,如部分库或表完全备份、增......
  • 欧拉OpenEuler安装MySQL8
    1.安装mysqltar-xvfmysql-8.0.21-linux-glibc2.12-x86_64.tarmvmysql-8.0.21-linux-glibc2.12-x86_64/usr/local/mysql2.配置mysqlvim/etc/my.cnf[client]default-character-set=utf8mb4[mysqld]#nd-address=0.0.0.0port=3306user=mysqlbasedir=/usr/local/m......
  • 免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原
    目 录摘要11绪论11.1选题意义11.2开发现状11.3springboot框架介绍11.4论文结构与章节安排12 房屋租赁系统小程序系统分析32.1可行性分析32.1.1技术可行性分析32.1.2经济可行性分析32.1.3法律可行性分析32.2系统功能分析32.2.1功能性分析......
  • 关于PHP连接MySQL数据库连接问题
    ​一、运行环境PHP版本为7.2.34MySQL版本为8.0.26二、问题运行过程中PHPthink始终无法访问到MySQL服务,且报错500响应。PHP直接连接SQL测试:<?php$servername="127.0.0.1";//数据库地址$username="root";//用户名$password="admin";//密码$database="data";......
  • 为什么MySQL单表不能超过2000万行? (1)
    ​最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。文中提到,他朋友在面试的过程中说,自己的工作就是把用户操作信息存到MySQL里,因为数据量超大(5000万条左右),需要每天定时生成3张表,然后将数据取模分别存到这三张表里。下面是两人的对......
  • MySQL日志之误删恢复数据
    目录1误删恢复数据1.1引言1.2解决方案1.2.1通用操作1.2.1.1确认binlog开启1.2.1.2binlog模式1.2.1.3binlog信息查询1.2.2方案一:找到insert语句,重新插入1.2.2.1找到binlog文件1.2.2.2根据时间点解析binlog文件1.2.2.2.1statement模式确认binlog位置1.2.2.2.2row模式确......
  • Mysql锁机制
    前序:    锁可以看作是一把现实生活中的锁,它的作用就是锁住东西确保安全。如果大家有其他语言开发经验,其实就很容易理解锁原理。例如Java语言中,Synchronized与Lock锁,就是用来保证并发安全性的。1、Mysql锁的概念    Mysql锁是管理并发控制与数据一致性的......
  • 开启TDE后mysqldump使用
    环境:mysql:5.7.39-log 导出加密表/opt/mysql57/bin/mysqldump-hlocalhost-uroot-pmysql-P13306--default-character-set=utf8--hex-blob--set-gtid-purged=OFF-S/opt/mysql57/data/mysql.sockdb_testtb_tde>/tmp/tb_tde.dump 导入到无加密环境的库下/opt/mysql......
  • MySQL基础-事务
    1.事务简介2.事务操作--转账操作(张三给李四转账1000)--正常情况--1.查询张三账户余额select*fromaccountwherename='张三';--2.将张三账户余额-1000updateaccountsetmoney=money-1000wherename='张三';--3.将李四账户余额+1000updateaccoun......