MyISAM和MEMORY存储引擎采用的是表级锁,InnoDB存储引擎既支持行级锁又支持表级锁
一、MyISAM表锁
MySQL的表级锁有两种模式:表共享读锁和表独占写锁
1、对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
注意:
①有两个session,s1和s2,当s1中添加了表共享读锁时,s1会话中也不可以进行新增、修改操作
②当s1会话中对某张表上了表共享读锁后,在s1会话中去查未上表共享读锁的表数据会报错
2、对MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作
二、InnoDB的行锁模式及加锁方法
注意:
InnoDB行锁是通过给索引上的索引项加锁来实现的,若表中无索引,则会进化为表级锁
1、共享锁:能进行读操作,不能进行写操作
s1、s2两个会话共同操作一张表
s1:select * from table where id=1 lock in share model;
s2:select * from table where id=2; 可以正常查询
s2:update table set name=‘111‘ where id=1; 此时不能进行修改操作
2、排他锁
s1、s2两个会话共同操作一张表
s1:select * from table where id=1 for update;
s2:查询同张表数据没问题select * from table where id=2;
select * from table where id=2 for update; 此时会报错
3、自增锁:针对自增列自增长的一种锁
新建了一张表,往这张表中插入10条数据,未commit前回滚了,若此时向表中插入5条数据,id从11开始
4、模拟死锁
图左为s1,图右为s2
①s1、s2先分别对id=1与id=2添加排他锁
②s1中对id=2行添加排他锁,执行
③s2中对id=1行添加排他锁,执行
此时相当于四个锁相互循环锁死,mysql会自动释放锁,这就模拟了死锁的场景