Mysql读写锁保姆级图文教程

准备

创建 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 即没有加过锁,为 表示有锁。

Mysql读写锁保姆级图文教程_第1张图片

2.运行 locktable mylock read,lagou write 加锁后,show open tables 可见加锁成功。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

运行 unlock tables 释放锁。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3.开启两个查询,在 session1 加读锁 lock table mylock read

Mysql读写锁保姆级图文教程_第2张图片

都可查询成功。

4.在 session2 读任何表都不会受影响

Mysql读写锁保姆级图文教程_第3张图片

5.在 session1 中查询其他表或更新表都不行。

Mysql读写锁保姆级图文教程_第4张图片

Mysql读写锁保姆级图文教程_第5张图片

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

Mysql读写锁保姆级图文教程_第6张图片

二、写锁

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

排他锁又称为写锁,简称 X 锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

先 unlock tables 释放锁,再在 session1 运行 locktable mylock write 加写锁

1.在 session1 中更新成功

Mysql读写锁保姆级图文教程_第7张图片

查询失败

Mysql读写锁保姆级图文教程_第8张图片

2.在 session2 中查询会阻塞

Mysql读写锁保姆级图文教程_第9张图片

三、总结

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

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

Mysql读写锁保姆级图文教程_第10张图片

结论

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

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

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

你可能感兴趣的:(consul,wordpress,firefox,iot,qml)