数据库锁---MyISAM的表锁

锁的分类:

对数据库操作的粒度分:行锁,表锁

对数据操作的类型分:读锁,写锁

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响;

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

三种锁:

表锁(偏读):

偏向MyISAM引擎,开销小,加锁快;无死锁;锁定力度大,发生锁冲突的概率最高,并发度最低

我们测试一下MyISAM引擎的锁

建立一张表 指定使用myisam引擎

create table mylock (
id int not null primary key auto_increment,
name varchar(20) default ''
) 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');

测试锁 我们需要打开两个连接测试 我们命名为session1 session2
在这里插入图片描述
测试上锁:

查看表上的锁

show  open tables;

现在还没有锁
在这里插入图片描述
给mylock表上读锁 book上写锁

lock table mylock read,book write;

我们在查看表上的锁

show open tables;

这两个表有了锁
在这里插入图片描述
解锁操作

unlock tables;
show open tables;

在这里插入图片描述

上锁操作测试完了 我们来测试一下读锁会有哪些锁定限制

加上读锁

lock table mylock read;

两个连接进行查询 都可以查询的到
在这里插入图片描述
这时我们使用session1(也就是对表加读锁的那个连接)进行数据修改

可以看到报错了
在这里插入图片描述

 Table 'mylock' was locked with a READ lock and can't be updated */

表已经被锁定无法更新

那这个是后这时候我们这个session1连接能访问其他的表么

我们用锁定表的session1连接测试读取其他表

select *  from book;

结论是不能
在这里插入图片描述
我们再用session2连接 测试读取其他表

我们可以看到是可以的
在这里插入图片描述
那seession2连接可以修改当前表么

我们可以看到 会一直阻塞 知道session把表的锁释放才执行
在这里插入图片描述

结论:被读锁锁定期间  锁定表的线程可以读取锁定的表   修改锁定的表不可以   读取别的表也不可以
其他线程:可以读取锁定的表,可以读取其他线程  ,修改锁定的表会一直阻塞到session1表的读锁释放才执行

读锁测试完了 我们在测试一下写锁

把当前所有的锁释放

unlock tables;

mylock表加上写锁

lock tables mylock write;

session1连接测试修改自己

update mylock set name='a1' where id=1;

修改成功
在这里插入图片描述

session2测试修改

update  mylock set name='a11' where id=1;

又阻塞了
在这里插入图片描述

这时我们session1释放写锁在这里插入图片描述
session2写成功
在这里插入图片描述
我们session1再加锁进行测试

lock tables mylock write;

session1读取其他表
还是无法读取 锁没有释放
在这里插入图片描述
session2读取其他表

select * from  book;

成功
在这里插入图片描述
session2查询mylock表
在这里插入图片描述
会一直阻塞到session1释放锁

结论:session1可以对锁定的表进行增删改查  session2对当前的表进行操作会一直阻塞到锁释放 

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的所有表加写锁
总结:
1.对MyISAM表的读操作,不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的锁请求,只有当锁释放了后才会执行其他线程的写操作。
2.对MyISAM表的写操作,会阻塞其它进程对同一张表的读和写操作,只有当锁释放了之后,才会执行其他进程的读写操作。

参考了尚硅谷老师的视频此处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值