MySQL不支持锁升级,要一次获取所有需要的锁。
MyISAM中的表锁。写请求比读请求优先级高。
表共享读锁(Table Read Lock):lock tables xxx read local
表独占写锁(Table Write Lock):lock tables xxx write
concurrent_insert:控制并发插入行为,配合read local。
0:不允许并发插入。
1:如果表中没有空洞(表中间没有被删除的行),允许在一个进程读表的同时,另一个从表尾插入(默认)。
2:无论有没有空洞,都允许表尾插入。
InnoDB下,是给索引加行锁,如果没有通过索引条件检索数据,则会使用表锁。
共享锁(S):lock in share mode
排他锁(X):for update
表级锁,在获得一个锁之前,会先申请获得其意向锁,来阻塞其他冲突的锁请求。
假设线程A获得一个行锁,此时线程B想获得一个表锁,如果没有意向锁,则线程B需要先判断有没有冲突的表锁,然后判断表中每一行有没有冲突的行锁,这种方式效率很低。而有了意向锁之后,意向锁作为一个表级锁,可以极高效率地判断锁冲突情况。
锁住满足索引条件检索的区间,其他事务插入该区间内的数据时会失败,解决了幻读的问题。
原文:https://www.cnblogs.com/kunwu/p/13661178.html