保姆级Mysql读写锁图文教程丨【绽放吧!数据库】

举报
Code皮皮虾 发表于 2021/07/25 10:22:19 2021/07/25
【摘要】 > 1、对MyLSAM表的读操作(加读锁),不会阻塞其他线程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。 > 2、对MyLSAM表的读操作(加读锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。




准备

创建mylock

CREATE TABLE `mylock` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
【手动增加表锁】 lock table 表名字1 read(write),表名字2 read(write),其它;
【查看表上加过的锁】  show open tables; 
【释放表锁】unlock tables;

一、读锁

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

1.运行show open tables,可见In_use全为0即没有加过锁,为1表示有锁。
在这里插入图片描述
2.运行lock table mylock read,lagou write加锁后,show open tables可见加锁成功。

在这里插入图片描述
在这里插入图片描述
运行unlock tables释放锁。
在这里插入图片描述
在这里插入图片描述
3.开启两个查询,在session1加读锁lock table mylock read
在这里插入图片描述
都可查询成功。

4.在session2读任何表都不会受影响
在这里插入图片描述

5.在session1中查询其他表或更新表都不行。
在这里插入图片描述
在这里插入图片描述

6.在session2中更新表,则会阻塞

在这里插入图片描述

二、写锁

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

unlock tables释放锁,再在session1运行lock table mylock write加写锁

1.在session1中更新成功
在这里插入图片描述
查询失败
在这里插入图片描述
2.在session2中查询会阻塞
在这里插入图片描述

三、总结

在这里插入图片描述

Mylsam在执行查询语句(select)前,会自动涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MYSQL的表级锁有两种模式:
1.表共享读锁(Table Read Lock)
2.表共享写锁(Table Write Lock)

锁类型 可否兼容 读锁 写锁
读锁
写锁

结论:

1、对MyLSAM表的读操作(加读锁),不会阻塞其他线程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。

2、对MyLSAM表的读操作(加读锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。



觉得不错的小伙伴可以点赞关注和收藏哦!如有错误可以指出来。

【绽放吧!数据库】有奖征文火热进行中 https://bbs.huaweicloud.com/blogs/285617

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。