|
1
5
TL;DR提交事务以解除锁定ALTER表。 是的,ALTER TABLE可以阻塞很长时间。它看起来像是永远的。它实际上是 lock_wait_timeout ,默认为31536000秒,即365天。 在MySQL中,像ALTER TABLE这样的DDL语句需要一个 metadata lock 像SELECT、INSERT、UPDATE、DELETE这样的DML语句也持有“shared”元数据锁。共享锁可以由多个会话同时持有,但会阻止独占锁,因为独占锁要求它们是唯一一个持有表上任何类型锁的会话。 文件说明: 持有元数据锁的DML语句的目的是,它们可以保留表的可重复读取视图,而不必担心另一个会话正在执行DROP table或ALTER table以损害它们的表视图。此锁定是必需的,因为MySQL没有版本化的元数据( they are gradually working toward that ). 这意味着运行了简单SELECT但未提交的事务将阻塞需要锁定更改的DROP表或ALTER表。 引入在线DDL有一些细微差别。 Online DDL Performance and Concurrency 更详细地描述了ALTER表从获取共享元数据锁开始,因此未提交的事务不会阻止它。但是,如果ALTER TABLE更改的性质需要,下一阶段可能会将共享元数据锁升级为独占元数据锁。此时,锁获取被阻止,因为另一个事务仍然持有自己的元数据锁。 联机DDL并不适用于所有类型的ALTER TABLE操作;有些仍然需要独占锁。例如,更改数据类型需要一个独占锁。见 Online DDL Overview |
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |