Mysql读写锁保姆级图文教程

摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。
本文分享自华为云社区《Mysql保姆级读写锁图文教程丨【绽放吧!数据库】》,作者:Code皮皮虾 。
准备
创建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锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
【Mysql读写锁保姆级图文教程】1.运行show open tables,可见In_use全为0即没有加过锁,为1表示有锁。
Mysql读写锁保姆级图文教程
文章图片

2.运行lock table mylock read,lagou write加锁后,show open tables可见加锁成功。
Mysql读写锁保姆级图文教程
文章图片

3.开启两个查询,在session1加读锁lock table mylock read
Mysql读写锁保姆级图文教程
文章图片

都可查询成功。
4.在session2读任何表都不会受影响
Mysql读写锁保姆级图文教程
文章图片

5.在session1中查询其他表或更新表都不行。
Mysql读写锁保姆级图文教程
文章图片

Mysql读写锁保姆级图文教程
文章图片

6.在session2中更新表,则会阻塞。
Mysql读写锁保姆级图文教程
文章图片

写锁 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
先unlock tables释放锁,再在session1运行lock table mylock write加写锁
1.在session1中更新成功
Mysql读写锁保姆级图文教程
文章图片

但查询失败
Mysql读写锁保姆级图文教程
文章图片

2.在session2中查询会阻塞
Mysql读写锁保姆级图文教程
文章图片

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

结论: 1、对MyLSAM表的读操作(加读锁),不会阻塞其他线程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。
2、对MyLSAM表的读操作(加读锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。
简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。
点击关注,第一时间了解华为云新鲜技术~

    推荐阅读