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行级锁定分为共享锁和排它锁两种锁类型。
行级锁定在线示例:
# 共享锁示例 select * from try8_dev lock in share mode; # 排它锁示例,小提示:select 需要手动添加 for update,update 和 delete 会自动添加 select * from try8_dev for update;
假设数据在一般情况下不会造成冲突,所以仅在数据进行提交更新的时候,才会正式对数据的冲突进行监测,如果发现异常,则返回给用户错误信息,让用户决定后续怎么处理。乐观锁使用场景:适用于读多写少的操作,因为出现大量写操作会增加异常概率,对应的业务层需要不断重试,这样会降低系统性能。
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教程,主打原创,定期更新,全部免费,欢迎收藏学习和转载分享。