Mysql-全局锁、表锁、行锁

本文已收录于专栏
《数据库》

目录

  • 全局锁
    • 概述说明
    • 开启方式
    • 应用场景
  • 表锁
    • 概念说明
    • 实现方式
      • 意向锁
    • 开启方式
  • 行锁
    • 概念说明
    • 实现方式
      • 记录锁:
      • 间隙锁
      • 临键锁
  • 总结提升

全局锁

概述说明

  全局锁是是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
Mysql-全局锁、表锁、行锁_第1张图片

开启方式

加全局锁的方式:FLUSH TABLES WITH READ LOCK;   释放全局锁:UNLOCK TABLES

应用场景

  常用于执行一些需要对整个数据库进行操作的任务,比如备份、恢复和复制等。

表锁

概念说明

  表锁是指锁定整个表,当一个事务对表进行写操作时,其他事务无法对该表进行任何读写操作,直到该事务释放锁。表锁会限制并发访问,但可以减少锁的开销。

实现方式

意向锁

  意向锁:意向锁是⼀个表级锁,它解决的是表锁和⾏锁共存的问题。当我们需要给⼀个表加表锁的时候,我们需要根据去判断表中有没有数据⾏被锁定,以确定是否能加成
功。假如没有意向锁,那么我们就得遍历表中所有数据⾏来判断有没有⾏锁;有了意向锁这个表级锁之后,则我们直接判断⼀次就知道表中是否有数据⾏被锁定了。

  例如:要执⾏的事务 A 在申请⾏锁(写锁)之前,数据库会⾃动先给事务 A 申请表的意向排他锁。当事务 B 去申请表的互斥锁时就会失败,因为表上有意向排他锁之后事务 B 申请表的互斥锁时会被阻塞。

开启方式

      写锁:LOCK TABLES 表名 WRITE;    
      读锁:LOCK TABLES 表名 READ;

行锁

概念说明

  行锁是指锁定表中的某一行,当一个事务对某一行进行写操作时,其他事务无法对该行进行写操作,但可以进行读操作。行锁可以提高并发访问,但可能会增加锁的开销。

实现方式

记录锁:

  使用唯一索引进行等值查询的时候精确匹配到一条数据,此时就会对这条记录进行锁定
  例如:select * from t where id =6 for update;
Mysql-全局锁、表锁、行锁_第2张图片

间隙锁

  间隙锁指的是两个记录之间逻辑上没有填⼊数据的部分,是⼀个左开右开区域。
  例如:select * from t where id =3 for update; 或者 select * from t where id > 1 and id < 6 for update; 就会将(1,6)区间锁定。
Mysql-全局锁、表锁、行锁_第3张图片

临键锁

  临键锁是间隙加上它右边的记录组成的左开右闭区间。mysql 默认⾏锁类型就是 临 键 锁(Next-Key Locks) 。当使⽤唯⼀性索引,等值查询匹配到⼀条记录的时候,临键锁(Next-Key Locks)会退化成记录锁;没有匹配到任何记录的时候,退化成间隙锁。
  例如:select * from t where id > 1 and id <= 6 for update; 就会将(1,6]区间锁定
Mysql-全局锁、表锁、行锁_第4张图片

总结提升

  在实际应用中,需要根据实际需求选择合适的锁定方式,以提高数据库的性能和并发能力,并确保数据的一致性。

在这里插入图片描述


此文章对你有用的话记得留言+点赞+收藏哦

你可能感兴趣的:(数据库,mysql,数据库)