5.1 MySQL 锁机制

news/2024/11/28 21:41:19/

锁机制是 MySQL 用于控制并发访问的重要手段,通过锁定资源避免数据冲突。理解 MySQL 的锁机制,有助于开发者优化数据库性能并处理高并发场景。


1. 锁的概念

锁(Lock)是数据库系统为保证数据一致性和完整性,对特定资源(如表、行)设置的访问限制。通过锁机制,可以实现以下目标:

  • 保证事务的隔离性。
  • 防止数据读写冲突。
  • 提升并发性能。

2. 全局锁

2.1 概念

全局锁是针对整个数据库实例的一种锁机制。一旦加锁,所有对数据库的读写操作都会被阻塞。

2.2 作用和原理

全局锁的常见使用场景是数据备份,利用全局锁可以保证备份期间数据的一致性。

2.3 缺点和优点

优点缺点
能保证数据库的全局一致性会阻塞所有读写操作,影响性能
适用于小型业务场景不适合高并发、大规模业务场景

2.4 对应的业务场景

  • 数据库全量备份。
  • 需要短时间冻结业务的场景。

2.5 操作指令

  • 加锁:

    FLUSH TABLES WITH READ LOCK;
    
  • 数据备份: 使用 mysqldump 工具时,搭配

    --lock-all-tables
    

    参数。

    mysqldump --lock-all-tables -u root -p dbname > backup.sql
    
  • 解锁:

      UNLOCK TABLES;
    

2.6 案例

-- 加锁
FLUSH TABLES WITH READ LOCK;-- 数据备份
mysqldump --lock-all-tables -u root -p test_db > backup.sql-- 解锁
UNLOCK TABLES;

3. 表锁

3.1 简介

表锁是对整个表加锁,控制表的读写权限。表锁的范围比行锁更大,但实现简单。

3.2 分类

  • 表锁:直接对表进行锁定。
  • 元数据锁:用于保护表的元数据结构。
  • 意向锁:用来协调表锁和行锁。

3.3 表锁

分类及特点
类型特点
表共享读锁(S锁)允许多个事务同时读取表,但不允许写入
表独占写锁(X锁)阻塞所有读写操作,仅允许持有锁的事务操作表
加锁和查看锁
  • 加锁:

    LOCK TABLES table_name READ; -- 表共享读锁
    LOCK TABLES table_name WRITE; -- 表独占写锁
    
  • 解锁:

      UNLOCK TABLES;
    
  • 查看锁状态:

      SHOW OPEN TABLES WHERE In_use > 0;
    
案例
-- 给表加共享读锁
LOCK TABLES employees READ;-- 查询数据
SELECT * FROM employees;-- 解锁
UNLOCK TABLES;

3.4 元数据锁(MDL)

概念和作用

元数据锁是 MySQL 用于保护表结构的锁,当执行 ALTER TABLEDROP TABLE 时,会自动加上 MDL 锁。

查看锁状态
SHOW PROCESSLIST;
案例
-- 开启事务
START TRANSACTION;-- 查询表数据(持有 MDL 锁)
SELECT * FROM employees;-- 在另一个会话尝试修改表结构
ALTER TABLE employees ADD COLUMN age INT;
-- 此时会发现 ALTER 操作被阻塞。

3.5 意向锁

简介和作用

意向锁是表锁和行锁之间的一种协作机制,用于标记事务对表中某些行的意图。

分类
锁类型含义
意向共享锁(IS)标识事务想获取行级共享锁
意向排它锁(IX)标识事务想获取行级排它锁
兼容关系
表锁类型ISIXSX
IS
IX
S
X
案例
-- 开启事务
START TRANSACTION;-- 更新某行数据(自动加 IX 锁和行级锁)
UPDATE employees SET name = 'John' WHERE id = 1;-- 查看锁信息
SHOW ENGINE INNODB STATUS;

4. 行级锁

4.1 简介

行级锁是最细粒度的锁,用于锁定表中的特定行,减少并发冲突。


4.2 分类

行锁
  • 共享锁(S 锁):允许其他事务读取,但不允许写入。

     SELECT * FROM employees WHERE id = 1 LOCK IN SHARE MODE;
    
  • 排它锁(X 锁):禁止其他事务的读写。

    SELECT * FROM employees WHERE id = 1 FOR UPDATE;
    
间隙锁
  • 锁定索引之间的范围,防止插入操作。
  • 适用于 范围查询(如 BETWEEN)。
临建锁
  • 间隙锁和行锁的组合,用于防止幻读。

4.3 案例

-- 开启事务
START TRANSACTION;-- 加行级共享锁
SELECT * FROM employees WHERE id = 1 LOCK IN SHARE MODE;-- 加行级排它锁
SELECT * FROM employees WHERE id = 1 FOR UPDATE;-- 提交事务
COMMIT;

通过以上内容,可以掌握 MySQL 锁的分类、使用场景及实际操作方法。这些知识对于优化并发性能和解决锁冲突问题至关重要。


http://www.ppmy.cn/news/1550732.html

相关文章

Python 中的装饰器是什么?

装饰器是Python中一种非常强大的功能,它允许你在不修改原始函数代码的前提下,增加额外的功能或改变函数的行为。 装饰器本质上是一个接受函数作为参数的函数,并返回一个新的函数。 通过装饰器,我们可以轻松地实现诸如日志记录、…

Axios案例练习

使用原生的Ajax请求还是比较繁琐,所以说一般使用Axios,Axios是对于Ajax的封装,主要是为了简化书写。 Axios使用比较简单,主要分为两步: 1.在script标签的src中引入Axios文件 特别注意,这里是需要一对单独的…

java——Tomcat调优策略

Tomcat 作为一款广泛使用的 Java 应用服务器,其性能优化对于提高应用的响应速度和处理能力至关重要。优化方案可以从多个方面入手,包括但不限于内存优化、并发优化、连接器优化、JVM 调优、系统内核参数优化等。以下是这些优化方案的具体操作步骤&#x…

大模型智能客服系统是什么?

大模型智能客服系统是什么? 作者:开源大模型智能客服系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc,致力于成为大模型呼叫中心系统、电话机器人、智能呼叫中心系统、大模型智能客服系统;…

新能源整车厂车联网安全:架构、流程与融合

摘要: 本文从车联网安全工程师的视角出发,深入探讨新能源整车厂软件开发部门中车联网安全部门的角色与职责。详细阐述了关注组织架构和交付路径的重要性,并剖析如何将安全需求有效融入整车软件开发流程,涵盖基础软件、上层业务开发…

非线性控制器设计原理

非线性控制器设计原理 非线性控制器设计旨在解决非线性系统的控制问题,克服传统线性控制器在处理非线性现象(如饱和、死区、耦合、时变性等)时的不足。其核心在于利用非线性数学工具和设计方法,使控制系统在非线性条件下具备良好…

vue组件的基础功能使用

简单的组件分页 首先的是分页组件写好之后使用 :data进行数据绑定,mydata是请求过来的数据源,之后如果需要搜索什么的过滤可以替换,后面的内容currentpage4是页数,pagesize是每页多少条数据 如果需要输入框输入内容实时搜索 可以使用comput…

Java基于SSM框架的校园综合服务小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…