开发者学堂课程【MySQL 高级应用 - 索引和锁:读锁案例讲解】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8631
读锁案例讲解
一、表锁的定义
表锁(偏读):把整张表锁了
特点:偏向 MyISAM 存储引擎,开销小,加锁快;无死锁;锁定粒度大,打算锁冲突的概率最高,并发度最低。
建表插数据
Mysql>select*from my lock
//lock这张表有 id 和 name 两个部分
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
Creat table 建表 lock table 锁表
接下来我们也通过人工来锁表,备份的同时希望这个记录不动
1、【表级锁分析--建表 SQL】create table mylock (
id int not null primary key auto_increment,
name varchar(20)
)engine myisam;
insert into mylock(name) values(“a”);
insert into mylock(name) values(“b”);
insert into mylock(name) values(“c”)
;
insert into mylock(name) values(“
d
”
);
insert into mylock(name) values(“e”);
select * from mylock;
建立 session-1、session-2 两个终端连接到 linux
2、【手动增加表锁】
Lock table 表名字 read(write),表名字2read(write),其它;
locktable 加锁 unlocktable 解锁
read 锁为共享锁,能读自己,不能修改自己,不可以读别人
3、【查看表上加过的锁】
Show open tables// 查看锁的命令,如下图运行所示
Inuse 都为0,证明没有锁
那么我们现在要上一个锁,代码如下:
Mysql> lock table mylock read,book write;
//给 mylock 上一个读锁,book 上一个写锁,运行结果如下图:
mylock 以及 book 对应的 in_use 为1,证明加了一把锁
Mysql> unlock tables;
//释放锁运行结果如下图:
Mysql> show open table
//使用命令再次查询锁,此时
in_use 为0,那么证明此时已经解锁
二、读写锁对数据操作和系统操作有哪些影响
Session-1加锁过程
Mysql>lock table my lock read;
Quert OK, 0 rows affected (0.00 sec)
Mysql> lock table mylock read:
Query OK, 0 rows affected(0.00 sec)
Mysql> select*from my lock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
Mysql> update mylock set name=‘
a2
’
where id =1
ERROR 1099 (HY000):Table’
mylock was locked with a READ lock and can’t be updated
Lock and can’t be updated
Mysql>select * from book;
//读别的表,是不行的
ERROR 1100(HY000):Tablem‘
book
’
was not locked with LOCK TABLES
//主从复制 lock 目前是锁着的状态,只有把别的锁解锁后才可以继续使用。
Mysql>unlock tables;
//解锁 mylock
Query ok,0 rows affected (0.00 sec)
Session-2加锁过程
Mysql>select*from my lock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.01 sec)
Mysql> select * from mylock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
Mysql>select * from book;
Mysql> update mylock set name=‘
a3
’
where id =1
//读锁共享,此时 mylock 锁着的状态,执行状态如下:
Query OK,
1 row affected
(
45
,
41 sec
)
Rows matched: 1 Changed: 1 Warning: 0
我们为 mylock 表加 read 锁(读阻塞与例子)
三、session_1和session_2对比
Session_1 和 session_2需要对比查看 session_1.1对应
session_2.1
Session_1
1、获得表 mylock 的 READ 锁定
Mysql>lock table mylock read;
Query ok,0 rows affected (0.00 sec)
2、当前 session 可以查询该表记录
Mysql>selcet * from mylock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
3、当前 session 不能查询其他没有锁定的表
Mysql>select * from book;
Error 1100(HY000):table ‘book’ was not locked with lock tables
4、当前 session 中插入或者更新锁定的表都会提示错误
Mysql>select * from mylock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
运行结果如图所示:
5、释放锁
Mysql>unlock tables;
Query ok,0 rows affected (0.00 sec)
Session_2
1、链接终端
2、其他 session 也可以查询该表的记录
Mysql>selcet * from mylock;
id name
1 a
2 b
3 c
4 d
5 e
5 rows in set (0.00 sec)
3、其他 session 可以查询或者更新未锁定的表
Query OK,
1 row affected
(
0.02 sec
)
Rows matched: 1 Changed: 1 Warning: 0
Mysql>select * from staffs;
4、其他 session 插入或者更新锁定表会一直等待得锁;
Mysql >insert into mylock(name) values(‘e’);
5、Session2获得锁,插入操作完成
Mysql> insert into mylock(name) values(‘e’);
Query ok, 1 row affected (9 min 22.45 sec)