MySQL8 锁机制是指 MySQL 服务器本身内部执行锁定以管理多个会话对表内容的争用,MySQL8 锁类型常见的划分方式:全局锁定、表级锁定、页级锁定和行级锁定,当然锁类型也有其它分类,只是实现方式不同。
MySQL8 提供了全局加锁的方法,当您需要将整个库处于只读状态的时候,可以使用这个命令:
# 全局锁定 flush tables with read lock # 使用当前会话全局解锁 unlock tables
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
MySQL8 页级锁定比较特殊,实际使用场景较少,它的主要特点是介于表级锁定和行级锁定之间,所以其获取锁定所需要的资源开销、并发处理能力同样也是介于两者之间。
MySQL8 行级锁定是划分最小单位的锁类型,发生锁冲突概率最低、并发度最好,但是缺点也很明显,加锁慢、内存资源开销大,如果不合理使用很容易造成死锁等,MySQL8 行级锁定分为共享锁和排它锁两种锁类型。
行级锁定在线示例:
# 共享锁示例 select * from try8_dev lock in share mode; # 排它锁示例,小提示:select 需要手动添加 for update,update 和 delete 会自动添加 select * from try8_dev for update;
数据库的锁类型有很多其它的分类方式,这些锁类型在 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};
MySQL8 悲观锁具有强烈的排它性,即每次去拿数据的时候,都认为别人会修改,因此在处理整个数据的过程中,该数据始终保持锁定状态。悲观锁使用场景:适用于更新操作比较频繁、且对数据一致性要求较高的场景。MySQL8 的共享锁和排它锁在一定程度上都属于悲观锁,具体请参考上面章节。
MySQL8教程 - MySQL8 锁机制,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 锁机制开始,逐步到 MySQL8 锁类型示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。