其他分享
首页 > 其他分享> > 锁机制-MyISAM的锁模式

锁机制-MyISAM的锁模式

作者:互联网

目录

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