# 前言

## 先上一个图

MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁-LMLPHP


## 为什么要使用锁?

## 扩展阅读


一、MySQL 全局读锁

1.1 全局读锁的基本概念


1.2 全局读锁的使用场景


1.3 全局读锁的加锁与解锁

# 需要你连接数据库并使用数据库, 以下为示例

# mysql -u root -p

# use testDatabase;

# 加读锁
flush tables with read lock;

# 解锁
unlock tables;

1.4 数据库的备份或导表


二、MySQL 表锁

2.1 元数据锁(Matadata Lock - MDL)


2.1.1 MDL 锁基本信息


2.1.2 MDL 简单实例


2.2 自增锁(AUTO-INC 锁)


2.2.1 自增锁 - 锁定模式


2.2.2 自增锁 - 自我理解


  • 连续锁定模式 :innodb_autoinc_lock_mode = 1



  • 交错锁定模式 : innodb_autoinc_lock_mode = 2



  • 产生序列间隙 和 “丢失”自动增量值



  • 第二种情况 :

    • MySQL 5.7 及之前版本, 事务回滚后并重启 MySQL 服务, 则自增的 ID 值将重新分配给回滚之前最大的自动 ID 值。
    • MySQL 8.0 中, 自增 ID 值将被持久化, 防止重复使用以前分配的值。

    2.3 意向锁(隐式)


    2.3.1 意向共享锁(IS)


    2.3.2 意向独占锁(IX)


    2.3.3 意向锁的兼容性



    三、MySQL 行锁

    3.1 共享锁(S)

    3.1.1 加共享锁

    # 在 select 查询语句末尾加 lock in share mode
    # 例:
    select name from user where id = 5 lock in share mode;
    

    3.1.2 兼容表格


    3.2 独占锁(X)


    3.2.1 加独占锁

    # 在语句末尾加 for update
    # 例:
    select name from user where id = 5 for update;
    

    3.2.2 兼容表格


    3.3 记录锁(Record Locks)


    3.4 间隙锁(Gap Locks)


    3.4.1 插入意向锁


    3.5 临键锁(Next-Key Locks)


    四、MySQL 死锁

    4.1 死锁示例

    4.1.1 死锁超时释放


    4.1.2 死锁冲突释放


    4.2 死锁检测


    4.3 最小化处理死锁

    08-12 10:27