MySQL8 锁机制

MySQL8 锁机制,MySQL8教程,介绍 MySQL8 锁类型和锁机制等。

【全栈教程】:https://try8.cn/article
教程目录:
教程内容:
最近更新:2023-04-17

一、MySQL8 锁机制和锁类型介绍

MySQL8 锁机制是指 MySQL 服务器本身内部执行锁定以管理多个会话对表内容的争用,MySQL8 锁类型常见的划分方式:全局锁定、表级锁定、页级锁定和行级锁定,当然锁类型也有其它分类,只是实现方式不同。


1.1、MySQL8 锁类型简述

  • 全局锁定:最大限度的全局锁表方式;
  • 表级锁定:对整个表加锁,常用存储引擎如:MyISAM;
  • 页级锁定:对查询的一页数据加锁,常用存储引擎如:BDB;
  • 行级锁定:对表内按行记录加锁,常用存储引擎如:InnoDB。


二、MySQL8 常见的锁机制详解

2.1、MySQL8 全局锁定

MySQL8 提供了全局加锁的方法,当您需要将整个库处于只读状态的时候,可以使用这个命令:

# 全局锁定
flush tables with read lock
# 使用当前会话全局解锁
unlock tables


2.2、MySQL8 表级锁定

MySQL8 表级锁定就是为整张表加锁, 表级锁定分为表锁(读锁、写锁)和元数据锁,其中元数据锁无须显式使用。小提示:表更新的优先级高于表检索,因此当表被释放时,该锁先用于写锁队列的请求,然后再用于读锁队列中的请求。


表级锁定优点:

  • 所需内存资源消耗较少;
  • 速度快,适合批量和全表扫描。

表级锁定逻辑:

  • 写锁:如果表上没有锁则在其上放置一个写锁,否则将锁请求放入写锁队列依次执行;
  • 读锁:如果表上没有写锁,则在其上放置一个读锁,否则,将锁请求放入读锁队列。

表级锁定场景:

  • 适合只读为主的场景;
  • 适合多读或单用户场景;
  • 适合并发要求低的场景。


表级锁定在线示例:

# 创建测试表
create table if not exists `try8_dev` (`try8_id` int, `try8_name` varchar(200));
# 添加读锁
lock tables try8_dev read;
# 添加写锁
lock tables try8_dev write;
# 使用当前会话接锁当前表
unlock tables


2.3、MySQL8 页级锁定

MySQL8 页级锁定比较特殊,实际使用场景较少,它的主要特点是介于表级锁定和行级锁定之间,所以其获取锁定所需要的资源开销、并发处理能力同样也是介于两者之间。


2.4、MySQL8 行级锁定

MySQL8 行级锁定是划分最小单位的锁类型,发生锁冲突概率最低、并发度最好,但是缺点也很明显,加锁慢、内存资源开销大,如果不合理使用很容易造成死锁等,MySQL8 行级锁定分为共享锁和排它锁两种锁类型。

  • 共享锁:多个事务共享一把锁,都可以访问该行数据,但是只能访问不能修改,用于查询语句;
  • 排它锁:只有排它锁的当前事务可以对该行数据读取和修改,用于增删改查语句。


行级锁定在线示例:

# 共享锁示例
select * from try8_dev lock in share mode;
# 排它锁示例,小提示:select 需要手动添加 for update,update 和 delete 会自动添加
select * from try8_dev for update;


三、MySQL8 其它锁类型介绍

数据库的锁类型有很多其它的分类方式,这些锁类型在 MySQL8 锁机制中并没有设计专用的语法或者关键字,然而我们依然可以借助代码曲线实现,例如乐观锁和悲观锁的概念等。


3.1、MySQL8 乐观锁

假设数据在一般情况下不会造成冲突,所以仅在数据进行提交更新的时候,才会正式对数据的冲突进行监测,如果发现异常,则返回给用户错误信息,让用户决定后续怎么处理。乐观锁使用场景:适用于读多写少的操作,因为出现大量写操作会增加异常概率,对应的业务层需要不断重试,这样会降低系统性能。


MySQL8 乐观锁实战:

通过添加字段 version 来实现,当读取的时候,将 version 一同读出,数据每更新一次,version +1。这样每当提交更新的时候,判断表记录的版本与第一次读取的版本是否一致,值相同则更新,否则就放弃或重试。

# 创建测试表
create table if not exists `try8_dev` (`try8_id` int, `try8_name` varchar(200), version int);
# 读取表版本
select try8_id, try8_name, version from try8_dev where try8_id = 1;
# 更新表信息
update try8_dev set try8_name='已更新',version=version+1 where try8_id=1 and version={version};


3.2、MySQL8 悲观锁

MySQL8 悲观锁具有强烈的排它性,即每次去拿数据的时候,都认为别人会修改,因此在处理整个数据的过程中,该数据始终保持锁定状态。悲观锁使用场景:适用于更新操作比较频繁、且对数据一致性要求较高的场景。MySQL8 的共享锁和排它锁在一定程度上都属于悲观锁,具体请参考上面章节。


四、MySQL8 锁机制 总结

MySQL8教程 - MySQL8 锁机制,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 锁机制开始,逐步到 MySQL8 锁类型示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。