MyISAM 自动加锁机制
在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
二、MySql 的表级锁的两种模式
1.表共享读锁(Table Read Lock)
| 当前session | 其他 session |
---|
读锁表 | √ | √ |
写锁表 | × | 阻塞更新 |
读未锁表 | × | √ |
写未锁表 | × | √ |
2.表独占写锁(Table Write Lock)
| 当前session | 其他 session |
---|
读锁表 | √ | 阻塞查询 |
写锁表 | √ | 阻塞更新 |
读未锁表 | × | √ |
写未锁表 | × | √ |
注意
1.有时效写锁测试没有效果是因为 mysql 存在查询缓存。
2.当手动连续执行两次锁表操作时,最后执行的语句生效。
例如:
LOCK TABLE test01 READ;
LOCK TABLE test02 READ;
(test02 表生效)
总结
- 对 MyISAM 存储引擎表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞同一表的写请求,只有当读锁释放后,才会执行其他进行的写操作。
- 对 MyISAM 存储引擎表的写操作(加写表),会阻塞其他进程对同一表的读和写作操,只有当写表释放后,才会执行其他进程的读写操作
- 简单来说:读锁会阻塞写,而写锁会阻塞读写