2023-2更文10-mysql锁相关知识

74 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

mysql锁相关知识

前文

本文内容主要是关于mysql锁相关内容的一些总结与整理,对常用的mysql锁及加锁的方式等等内容进行总结。

mysql的锁知识

mysql的锁分类

按照不同的锁的级别,mysql的锁可以分为不同的类别,一般包括全局锁、表级锁和行级锁。

首先来了解一下全局锁,全局锁的加锁及锁的释放需要通过如下语句来执行:

flush tables with read lock
unlock tables

加锁后全数据库的内容就变为只读,所有的对数据库的更新、删除、插入等操作都会由于锁的存在而阻塞,如果想让上述行为生效,需要手动进行锁的释放。

看完了全局锁,那么就轮到了表级锁,表级锁顾名思义,就是锁住整张表。表锁可以按如下几种分类:

  • 表锁:表锁通过lock table xxx read ; lock table xxx write分别实现共享锁及独占锁的锁定。其中的共享锁会限制所有线程的数据插入,而独占锁会限制其他线程的所有行为。
  • 元数据锁:元数据锁不需要我们手动进行操作,当执行数据库结构变更时会自动触发独占锁,且优先级高于共享锁。而当进行查询、修改、新增、删除操作时会自动触发共享锁。
  • 意向锁:意向锁主要起到行级锁标志位的作用。例如当需要加行级独占锁时,需要提前查看是否已经存在独占锁,这时也就是意向锁的意义,直接通过表级锁获取当前表的锁状态,避免按照行去查看数据的锁状态。
  • auto-inc锁:该锁主要是针对于数据库的自增主键而言,通过该锁对插入的数据进行管理,实现数据库数据插入时其他的数据插入的阻塞状态,保证主键的连续性。

说完了表级锁,下面来说一下行级锁,行级锁的粒度比较细,所以是我们更为常用的一种数据库锁。通过如下的语句可以进行行级共享锁和独占锁的创建:

select ... lock in share mode;
select ... for update;

行级锁也可以更具体的分为记录锁、范围锁以及范围+记录三种,分别锁定的是单条记录、一定范围以及包含范围边界的记录。其中的范围锁主要是存在于可重复读隔离级别中,用来处理可重复读中可能出现的幻读问题。通过对于记录范围的锁定,当其他事务进行数据更新时,会被阻塞等待,也就避免了幻读的问题。另外一点是这三种锁在某些情况下会发生降级退化。当进行唯一索引查询时,记录不存在会变更为范围锁,记录存在会变更为记录锁;当进行非唯一索引查询时时,锁可能会退化为范围锁,而在主键索引锁定为记录锁。默认情况来说,一般提供的是next-key锁,也就是包含边界记录的范围锁。

总结

本文的内容主要是针对数据库锁的分类及各种锁的应用相关知识的总结,对理解数据库锁的内容有一定帮助。