写点什么

Mysql 读写锁保姆级图文教程

发布于: 2 小时前

​​​​​​​​​​​​​​摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。


本文分享自华为云社区《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 锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。


1.运行 showopen tables,可见 In_use 全为 0 即没有加过锁,为 1 表示有锁。



2.运行 locktable 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 运行 locktable mylock write 加写锁


1.在 session1 中更新成功


查询失败



2.在 session2 中查询会阻塞



三、总结



Mylsam 在执行查询语句(select)前,会自动涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。


MYSQL 的表级锁有两种模式:1.表共享读锁(Table Read Lock)2.表共享写锁(Table Write Lock)



结论:


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


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


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


点击关注,第一时间了解华为云新鲜技术~

发布于: 2 小时前阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Mysql读写锁保姆级图文教程