WordPress中MySQL表A的并发读写及多插入场景问题咨询
WordPress环境下MySQL表INSERT操作的锁与并发问题解答
1. 执行INSERT操作时表是否会被锁定?
这取决于表使用的存储引擎(WordPress默认采用InnoDB):
- InnoDB引擎:普通
INSERT操作只会锁定插入的目标行(以及必要的间隙锁,用于防止幻读),不会触发全表锁定。但如果是INSERT ... SELECT这类涉及读取其他数据的插入操作,或者带ON DUPLICATE KEY UPDATE的插入,可能会添加范围锁,影响范围更大,但依然不是全表锁。 - MyISAM引擎(WordPress极少使用):所有写操作都会触发全表锁定,
INSERT执行期间整个表会被锁住。
2. INSERT执行期间,读查询(SELECT)会出现什么情况?
分存储引擎说明:
- InnoDB引擎:默认使用
REPEATABLE READ隔离级别,普通SELECT采用快照读(基于MVCC机制),完全不会被INSERT操作阻塞,能读到INSERT执行前的快照数据。如果是加了FOR UPDATE/LOCK IN SHARE MODE的当前读查询,会等待INSERT释放对应行的锁后再执行。 - MyISAM引擎:读查询会被
INSERT操作阻塞,必须等待INSERT完成释放表锁后才能执行。
3. 多个并发INSERT操作会发生什么?
- InnoDB引擎:
- 如果插入的记录没有主键/唯一键冲突,多个
INSERT可以并行执行,因为行级锁互不干扰,互不阻塞。 - 如果存在主键/唯一键冲突,冲突的
INSERT操作会进入等待队列,直到前面的操作完成:若前面的INSERT成功,后续冲突的INSERT会抛出主键/唯一键重复的错误;如果是带ON DUPLICATE KEY UPDATE的语句,则会执行更新操作。
- 如果插入的记录没有主键/唯一键冲突,多个
- MyISAM引擎:多个
INSERT会串行执行,同一时间只能有一个写操作执行,其他写请求排队等待表锁释放。
内容的提问来源于stack exchange,提问作者Filip Eriksson
相关产品推荐
相关产品推荐

