MySQL——九、锁

分类

  • 全局锁
  • 表级锁
  • 行级锁

全局锁

做全库的逻辑备份

mysql 复制代码
flush tables with read lock;
unlock tables;

在InnoDB引擎中,我们可以在备份时加上参数--single-transaction参数来完成不加锁的一致性数据备份

mysql 复制代码
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql

表级锁

表锁

  • 表共享读锁(read lock)

  • 表独占写锁(write lock)

mysql 复制代码
-- 加锁
lock tables 表名... read/write
-- 释放锁
unlock tables 

元数据锁(meta data lock,MDL)

MDL加锁过程是系统自动控制,无需显示使用。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务时,不可以对原数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。

意向锁

避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

  • 意向共享锁(IS):由语句select ... lock in share mode 添加。与表锁共享锁(read)兼容,与表锁排它锁(write)互斥
  • 意向排他锁(IX):与表锁共享锁(read)及排他锁(write)都互斥。意向锁之间不会互斥。

行级锁

锁住对应的行数据,InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁

InnoDB有行级锁,而MyIsam没有

  • 行锁:锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC,RR隔离级别下都支持
  • 间隙锁:锁定索引记录间隙,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
  • 临键锁:行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在PR隔离级别下支持。

行锁

  • 共享锁
  • 排他锁
    InnoDB的行锁是针对与索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

间隙锁/临建锁

间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一个间隙上采用间隙锁。

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
  • 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询时,退化为间隙锁
  • 索引上的范围查询(唯一索引),回访问到不满足条件的第一个值为止。
相关推荐
霖霖总总13 分钟前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
heartbeat..5 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据7 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦8 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
myzshare8 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序
YMatrix 官方技术社区8 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录9 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong9 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
墨笔之风10 小时前
java后端根据双数据源进行不同的接口查询
java·开发语言·mysql·postgres
欧亚学术10 小时前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表