ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

锁机制-MyISAM的锁模式

2022-07-22 21:04:48  阅读:144  来源: 互联网

标签:tablelock 加锁 -- lock 模式 会话 MyISAM table 机制


目录

MyISAM的锁模式

MyISAM存储引擎使用表锁,不支持行级锁;

MyISAM在执行査询语句(SELECT)前,会自动给涉及的表加读锁,在执行更新操作(DML)前,会自动给涉及的表加写锁,在SQL执行完后会自动释放锁。
并且MyISAM 不支持事务,不能回滚撤销,不用提交。
(或者说 MyISAM执行的每条SQL都是一次事务,都会以 串行化的隔离级别 运行。)

所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁).会阻塞其他进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

准备数据

create table tablelock
(
id int primary key auto_increment, --自增操作MYSQL/SQLSERVER支持;oracle需要借助于序列来实现自增
name varchar(20)
)engine=myisam;

insert into tablelock(name) values('al');
insert into tablelock(name) values('a2');
insert into tablelock(name) values('a3');
insert into tablelock(name) values ('a4');
insert into tablelock(name) values ('a5');
commit;

加读锁(共享锁)

会话0:

lock table tablelock read ;  --对tablelock加读锁

-- 测试对tablelock的读与写
select * from tablelock; --读(査),可以
delete from tablelock where id =1 ; --写(增刪改),不可以

-- 测试对其他表的读与写
select * from emp ; --读,不可以
delete from tablelock where eno = 1; --写,不可以

image

小结:
如果某一个会话对A表加了read锁,则该会话
可以对A表进行读操作、不能进行写操作;且该会话不能对其他表进行读、写操作。

即如果给A表加了读锁,则当前会话只能对A表进行读操作。

会话1 (其他会话):

select * from tablelock; --读(査),可以
delete from tablelock where id =5 ; --写,需要"等待"会话0将锁释放

select * from emp ; --读(査),可以
delete from emp where eno = 1; -- 写,可以

image

小结:
会话0给A表加了锁,则其他会话:
a.可以对其他表(A表以外的表)进行读、写操作
b.对A表:读-可以;写-需要等待释放锁。

加写锁(排他锁)

会话0:
lock table tablelock write ;

结论和读锁大致一样:
当前会话(会话0)可以对加了写锁的表进行任何操作(增刪改査);但是不能操作其他表

其他会话:
对会话0中加写锁的表可以进行增删改查的前提是:等待会话0释放写锁

加锁数量的限制

多个会话是否可以对同一个表加锁

会话0对tablelock加表级读锁,会话1对tablelock加表级读锁,会话3查看锁数量

会话0:lock table tablelock read ;
会话1:lock table tablelock read ;
会话3:show open tables;

image
这个时候加锁数为2 | test | tablelock | 2 | 0 |

会话0对tablelock加表级读锁,会话1对tablelock加表级写锁,会话3查看锁数量

会话0:lock table tablelock read ;
会话1:lock table tablelock write ; -- 阻塞
会话3:show open tables;

这个时候加锁数为1 | test | tablelock | 1 | 0 |

会话0对tablelock加表级写锁,会话1对tablelock加表级写锁,会话3查看锁数量

会话0:lock table tablelock write ;
会话1:lock table tablelock write ; -- 阻塞
会话3:show open tables;

这个时候加锁数为1 | test | tablelock | 1 | 0 |

会话0对tablelock加表级写锁,会话1对tablelock加表级读锁,会话3查看锁数量

会话0:lock table tablelock write ;
会话1:lock table tablelock read ; -- 阻塞
会话3:show open tables;

这个时候加锁数为1 | test | tablelock | 1 | 0 |

多个会话 对 同一个表 读锁可以加多个,写锁只能加一个,并且 不能同时加读锁与写锁。

同一个会话是否可以对多个表加锁

创建tablelock2

create table tablelock2
-> (
-> id int,
-> name varchar(20)
-> ) engine=myisam;

会话1,对tablelock加读锁,然后对tablelock2加读锁,会话3查看锁数量
会话1:lock table tablelock read ;
lock table tablelock2 read ;

会话3:
show open tables;
delete from tablelock where id = 2;

锁数量1,会话3对tablelock执行删除操作,执行成功
image

会话0,对tablelock加读锁,然后对tablelock2加写锁,会话3查看锁数量

结果同上

会话0,对tablelock加写锁,然后对tablelock2加写锁,会话3查看锁数量

结果同上

会话0,对tablelock加写锁,然后对tablelock2加读锁,会话3查看锁数量
结果同上

同一个会话 只能给一个表加锁,如果继续给另外一个表加锁,会自动释放前面的锁

标签:tablelock,加锁,--,lock,模式,会话,MyISAM,table,机制
来源: https://www.cnblogs.com/jiyuchen1/p/16507887.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有