更改表而不锁定整个表

Man*_*noj 35 mysql

是否

ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)

锁定整个桌子?

Sch*_*ern 62

简短回答:对于MySQL <5.6需要锁定.从5.6开始,使用InnoDB,许多ALTER TABLE操作(包括添加列)不需要锁.


如果您使用的是MySQL 5.5或更早版本,它将获得整个操作的读锁定,然后在结尾处进行简短的写锁定.

从ALTER TABLE的MySQL文档 ...

在大多数情况下,ALTER TABLE生成原始表的临时副本...当ALTER TABLE正在执行时,原始表可由其他会话读取(不久之后注明).对ALTER TABLE操作开始后开始的表的更新和写入将停止,直到新表准备好...

前面提到的异常是ALTER TABLE块在准备好安装表.frm文件的新版本,丢弃旧文件以及从表和表中清除过时的表结构时读取(而不仅仅是写入)定义缓存.此时,它必须获得独占锁.

也就是说,当添加一个列时,它会读取大部分操作的表,然后在结尾处获得一个写锁.


MySQL 5.6将在线DDL添加到InnoDB中,可以加速和改进许多内容,例如更改表和索引.向表中添加列将不再需要表锁,除了操作开始和结束时的简短排它锁.

应该自动发生,但要确保设置ALGORITHM=inplaceLOCK=none你的ALTER TABLE陈述.

有一个例外......

在MySQL 5.6之前创建的InnoDB表不支持ALTER TABLE ... ALGORITHM = INPLACE用于包含时间列(DATE,DATETIME或TIMESTAMP)的表,并且尚未使用ALTER TABLE ... ALGORITHM = COPY重建.

  • @TanguyP“*此时[准备安装新版本的表.frm文件,丢弃旧文件,...],它必须获取排它锁。*”排它锁是写锁并阻止读取和写入。读(共享)锁仅阻止写入。 (2认同)