MySQL 锁分类

MySQL 锁分类

在 MySQL 中,为了保证并发性能和数据安全,有多种锁机制。我们常见的有表级锁和行级锁。让我们一起来学习 MySQL 中各种锁的知识。

表级锁

表级锁是对整张表进行锁定。

表数据锁

1. 读锁

允许多个会话同时读取同一张表的数据,但不允许其他会话对该表进行写操作。

例如: 多个用户可以同时查看同一份订单表,但任何用户都无法在查看时修改订单数据。

2. 写锁

只允许一个会话对表进行写操作,其他会话无法读取或写入该表。

例如: 当一个用户在对订单表进行结算操作时,其他用户无法同时对订单表进行任何操作,直到结算完成。

3. 意向锁

意向锁是一个标识位,用来表示某个事务对表中某一区域(如行或表)的意图进行锁定。当有其他事务要对表进行加锁时,不需要遍历整张表,只需检查意向锁的存在即可。

表结构锁

元数据锁(MDL)

MySQL 默认开启元数据锁,用来保护表结构的并发修改。当有线程修改表结构时,会进行加锁操作,防止其他线程同时修改表结构。

例如: 当一个用户在对表添加新列时,其他用户无法同时修改表的其他结构,以确保表结构修改的安全性。

行级锁

行级锁允许同时操作表中的多行数据,提高了并发处理能力。

1. 共享锁(S 锁)

共享锁用于读取操作,多个线程可以同时持有共享锁,但阻止其他线程获取排他锁,保证数据读取的一致性。

例如: 多个用户可以同时读取订单表中的订单信息,但不允许任何用户在读取时修改订单数据。

2. 排他锁(X 锁)

排他锁用于写入操作,只允许一个线程持有排他锁,其他线程无法同时持有共享锁或排他锁,保证数据的独占性。

例如: 当一个用户在对订单表中的订单进行修改时,其他用户无法同时读取或修改同一订单数据,直到修改完成。

特殊行锁

1. 间隙锁

间隙锁用于锁定数据索引之间的间隙,防止其他事务在间隙内插入新数据,保证查询结果的一致性。它只影响索引间隙,而不锁定已有数据行。

例如: 当一个事务使用范围查询锁定某些订单号的索引间隙时,其他事务无法在这些订单号的索引间隙内插入新订单。

2. 临键锁

临界锁是行锁和间隙锁的结合体,既锁定特定行数据,也锁定其索引间隙,确保在操作过程中数据的完整性和一致性。

例如: 当一个事务锁定了某个订单的具体行数据及其订单号的索引间隙时,确保其他事务无法同时插入新订单或修改现有订单。

如何更安全的为表更新表结构?

当一个生产环境表需要更新表结构时,会引起MDL(元数据)锁,若此表有大量业务查询,将会影响其他业务使用,长时间等待连接阻塞,可以使用为更新表结构语句设置等待时间方式,阻塞时间过长则放弃,人为更新其结构,避免过度影响线上

相关推荐

  1. 学会MySQL(2)——间隙算法分析

    2024-07-14 17:40:03       27 阅读
  2. <span style='color:red;'>MYSQL</span> <span style='color:red;'>锁</span>

    MYSQL

    2024-07-14 17:40:03      55 阅读
  3. <span style='color:red;'>mysql</span>-<span style='color:red;'>锁</span>

    mysql-

    2024-07-14 17:40:03      39 阅读
  4. <span style='color:red;'>Mysql</span>-<span style='color:red;'>锁</span>

    Mysql-

    2024-07-14 17:40:03      41 阅读
  5. <span style='color:red;'>MySQL</span> <span style='color:red;'>锁</span>

    MySQL

    2024-07-14 17:40:03      31 阅读
  6. <span style='color:red;'>MySQL</span><span style='color:red;'>锁</span>

    MySQL

    2024-07-14 17:40:03      28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 17:40:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 17:40:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 17:40:03       62 阅读
  4. Python语言-面向对象

    2024-07-14 17:40:03       72 阅读

热门阅读

  1. Nmap端口扫描工具

    2024-07-14 17:40:03       23 阅读
  2. 如何设计一个C语言面向结构体的内存数据库

    2024-07-14 17:40:03       21 阅读
  3. NSIS 之 NsDialogs 常见问题解答

    2024-07-14 17:40:03       21 阅读
  4. Nginx配置缺少导致CSS不起作用

    2024-07-14 17:40:03       23 阅读
  5. 抽象代数精解【1】

    2024-07-14 17:40:03       21 阅读
  6. c#协变逆变

    2024-07-14 17:40:03       16 阅读
  7. 【每日一练】python函数与装饰器

    2024-07-14 17:40:03       30 阅读
  8. 27 设备流转使用心得 三

    2024-07-14 17:40:03       27 阅读
  9. 删除矩阵中0所在行 matlab

    2024-07-14 17:40:03       21 阅读
  10. 英文论文审稿2

    2024-07-14 17:40:03       25 阅读
  11. 半导体行业术语Part01

    2024-07-14 17:40:03       28 阅读
  12. go语言 中 new能初始化哪些类型?

    2024-07-14 17:40:03       20 阅读