InnoDB表锁 - 读锁(显示指定)
语句:
lock tabe 表名 read;
unlock table;
结论:
表级读锁/会话session | 读操作 | 写操作 |
---|---|---|
当前session | 可以 | 报错 |
其他session | 可以 | 阻塞等待 |
实验:
session1 | session2 |
---|---|
lock table edu_user read; | |
select * from edu_user; | select * from edu_user; |
update edu_user set username="张居正" where username = "张思德"; | |
1099 - Table 'edu_user' was locked with a READ lock and can't be updated | |
阻塞:update edu_user set username="张居正" where username = "张思德"; | |
unlock table; | |
执行:update edu_user set username="张居正" where username = "张思德"; |
说明:
当前session获取表级读锁后,不管是当前session还是其他session都只能读不能写。其他session如果想要写,那么会先阻塞,等表锁释放之后,会自动执行,但是不一定会成功,譬如主键冲突以及索引唯一等,写操作执行失败。
InnoDB表锁 - 写锁(显示指定)
语句:
lock tabe 表名 write;
unlock table;
结论:
表级写锁/会话session | 读操作 | 写操作 |
---|---|---|
当前session | 可以 | 可以 |
其他session | 阻塞等待 | 阻塞等待 |
实验:
session1 | session2 |
---|---|
lock table edu_user write; | |
select * from edu_user; | |
update edu_user set username="张居正" where username = "张思德"; | |
阻塞:select * from edu_user; | |
阻塞:update edu_user set username = "杨树林" where username="杨幂"; | |
unlock table; | |
执行:select * from edu_user; | |
执行:update edu_user set username = "杨树林" where username="杨幂"; |
说明:
当获取表锁write时,当前的session将可以进行读操作和写操作,其他session都将处于阻塞等待状态(不可以读也不可以写),其他session只有等当前表锁被释放才可以读写。