读锁案例讲解|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 快速学习读锁案例讲解

开发者学堂课程【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-1session-2 两个终端连接到 linux

2、【手动增加表锁】

Lock table 表名字 readwrite,表名字2readwrite),其它;

locktable 加锁 unlocktable 解锁

read 锁为共享锁,能读自己,不能修改自己,不可以读别人

3、【查看表上加过的锁】

Show open tables// 查看锁的命令,如下图运行所示

Inuse 都为0,证明没有锁

image.png

那么我们现在要上一个锁,代码如下:

Mysql> lock table mylock read,book write;

//给 mylock 上一个读锁,book 上一个写锁,运行结果如下图:

mylock 以及 book 对应的 in_use 1,证明加了一把锁

image.png

Mysql> unlock  tables;

//释放锁运行结果如下图:

Mysql>  show open table

//使用命令再次查询锁,此时

in_use 为0,那么证明此时已经解锁

image.png


二、读写锁对数据操作和系统操作有哪些影响

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 affected4541 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)

运行结果如图所示:

image.png

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 affected0.02 sec

Rows matched: 1 Changed: 1  Warning: 0

Mysql>select * from staffs;

image.png

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)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
28天前
|
缓存 数据库
共享锁和排他锁的使用场景
【10月更文挑战第16天】共享锁和排他锁是多进程和多线程环境中常用的同步机制,它们在不同的场景下发挥着重要作用。选择合适的锁类型取决于并发需求、数据一致性要求、性能考虑和资源竞争等因素。在实际应用中,需要根据具体情况仔细评估和选择合适的锁策略,以确保系统的正确性和性能。
|
7月前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
7月前
|
存储 关系型数据库 MySQL
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
302 0
|
7月前
|
关系型数据库 MySQL 数据库
|
数据库
深入浅出理解数据库s锁和x锁
深入浅出理解数据库s锁和x锁
712 1
|
7月前
|
安全 编译器 Linux
多线程(进阶一:锁策略)
多线程(进阶一:锁策略)
165 0
|
Linux C语言
一个简单案例理解为什么在多线程的应用中要使用锁
一个简单案例理解为什么在多线程的应用中要使用锁
38 0
|
SQL Java 数据库连接
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
108 0
|
关系型数据库 MySQL 数据库
请解释MySQL中的锁机制,包括共享锁和排他锁的概念和区别。
MySQL中的锁机制是用于管理并发访问数据库的一种技术。通过使用锁,可以确保在同一时间只有一个用户或进程能够对数据进行读取或修改,以避免数据冲突和不一致性。
|
SQL 关系型数据库 MySQL
行锁案例讲解|学习笔记
快速学习行锁案例讲解
行锁案例讲解|学习笔记