InnoDB表级锁
我们在之前知道,InnoDB是行锁,但是不是每次都获取行锁,如果没有索引项的话,还是一个表锁。而且有的时候,我们希望直接去使用表锁。
在绝大部分情况下都应该使用行锁,因为事务和行锁往往是选择InnoDB存储引擎的理由,但个别情况下也使用表级锁;
- 事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,给大部分行都加锁,还不如直接给整张表加锁呢。不仅这个事务执行效率低,而且可能造成其他事务长时间等待和锁冲突;
- 事务涉及多个表,比较复杂,如果都用行锁,很可能引起死锁,造成大量事务回滚。
如:
- LOCK TABLE user READ; 读锁锁表(获取这张表的读锁)
- LOCK TABLE user WRITE; 写锁锁表(获取这张表的写锁)
- 事务执行…
- COMMIT/ROLLBACK; 事务提交或者回滚
- UNLOCK TABLES; 本身自带提交事务,释放线程占用的所有表
在使用表锁的时候,涉及到效率的问题:
- 如果我们要获取一张表的共享锁S或者排它锁X,最起码得确定,这张表<