MySQL锁机制

MySQL锁机制

2020.3.1学习总结

读锁和写锁

在MySQL中,按照对数据操作的类别(读/写)可以把锁分为读锁和写锁。
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁

表锁

1.表锁
1.1表锁(偏读)的特点:

  • 表锁偏向于MyISAM存储引擎,开销小,加锁快
  • 无死锁
  • 锁定粒度大(锁的是整个表)
  • 发生锁冲突的概率最高,并发度最低

1.2案例分析:
先建立一个新表,存储引擎使用MyISAM

CREATE TABLE lockTest(
	id int NOT NULL PRIMARY KEY auto_increment,
	name VARCHAR(20)
)ENGINE myisam;

往其中插入五条数据
在这里插入图片描述
手动增加表锁的命令

lock table 表名1 read(write),表名2 read(write) ...;

手动解开表锁的命令

unlock table 表名1,表名2 ...;

现在对lockTest复制一份,命名为lockTest2
使用Xshell软件打开两个Session,都进入了MySQL服务中:
在这里插入图片描述
现在,在session1给lockTest加读锁

lock table lockTest read;

然后执行命令:

select * from lockTest;

该操作可以执行:
在这里插入图片描述
再执行以下修改命令:

update lockTest set name='a2' where id = 1;

果不其然,报错,无法修改,因为读锁把整个表给锁上了,无法对其进行写操作。
在这里插入图片描述
看看该session能不能读取其他的表

 select * from lockTest2;

结果很遗憾,不行
在这里插入图片描述
现在将视线转移到session2,显然,读表操作是没有问题的:
在这里插入图片描述
但是往加了读锁的表写数据,会出现什么问题呢?
在这里插入图片描述
看吧,写操作被阻塞了。
我们再把视线转移到session1,让其把lockTest表的读锁释放掉

unlock table lockTest;

马上,session2中的update语句就执行成功了。
这个案例给我们的启发就是,读锁会阻塞写操作。

再看看以下操作:
session1执行:

lock lockTest write;

session1可以执行:

 select * from lockTest;
 update lockTest set name='a2' where id =1;

但是不能执行:

select * from lockTest2;
update lockTest2 set name='a2' where id =1;

session2可以增删查改除了lockTest以外的表,但是

select * from lockTest;

会被阻塞,直到session1释放锁.

下面对以上案例进行总结:
MyISAM在执行查询语句(select)前,会自动给涉及的所以表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式:
表共享读锁和表独占写锁

锁类型可否兼容读锁写锁
读锁
写锁

结合上表,对MyISAM表进行操作,会出现以下情况:
1.对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。
2.对MyISAM表的写操作(加写锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。
简而言之,一个线程给表加了读锁,会阻塞其他线程的写;给表加了写锁,会阻塞其他线程的读和写。

表锁分析,看看哪些表被锁了的命令

show open tables;

在这里插入图片描述
MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎。因为写锁后,其他线程不做任何操作,会一直阻塞。

行锁

在这里插入图片描述

剩下的就不写了,自己看看就好啦~
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值