mysql ALTER TABLE 并发控制

并发控制 Concurrency Control

For ALTER TABLE operations that support it, you can use the LOCK clause to control the level of

concurrent reads and writes on a table while it is being altered. Specifying a non-default value for this

clause enables you to require a certain amount of concurrent access or exclusivity during the alter

operation, and halts the operation if the requested degree of locking is not available. The parameters

for the LOCK clause are:(支持指定LOCK语法的ALTER TABLE语句修改表时,可指定 LOCK 语法控制正在ALTER时对该表的并发读写限制,指定的 LOCK 为非默认值可明确限定并发或排他性访问策略,若指定的 LOCK 不支持,则ALTER TABLE时对表的访问被阻塞。)

• LOCK = DEFAULT (默认值,最大程度,特定算法和ALTER操作下尽可能地支持并发,如(算法和ALTER操作)支持,允许并发读写,如不支持,尝试支持并发读,如再不支持,强制排他性访问)

Maximum level of concurrency for the given ALGORITHM clause (if any) and ALTER TABLE

operation: Permit concurrent reads and writes if supported. If not, permit concurrent reads if

supported. If not, enforce exclusive access.

• LOCK = NONE(指定为NONE值,如特定算法和ALTER操作支持,允许并发读写,否则提示错误。)

If supported, permit concurrent reads and writes. Otherwise, an error occurs.

• LOCK = SHARED(指定为SHARED值,如特定算法和ALTER操作支持,允许并发读但阻塞写,尽管支持并发写,仍阻塞写,如特定算法和ALTER操作不支持并发读,则提示错误。)

If supported, permit concurrent reads but block writes. Writes are blocked even if concurrent writes

are supported by the storage engine for the given ALGORITHM clause (if any) and ALTER TABLE

operation. If concurrent reads are not supported, an error occurs.

• LOCK = EXCLUSIVE(指定为EXCLUSIVE值,强制排他性读写,尽管存储引擎支持并发读写,仍阻塞。)

Enforce exclusive access. This is done even if concurrent reads/writes are supported by the storage

engine for the given ALGORITHM clause (if any) and ALTER TABLE operation.

ALTER TABLE 实现算法

ALGORITHM [=] {DEFAULT | INPLACE | COPY}

COPY 变更在源表副本上进行,源表数据逐行复制到新表,期间不允许并发DML(数据操作)。

INPLACE 变更不创建副本,可能重新构建表数据结构并替代,变更的准备和执行阶段可能会使用元数据作为拍他锁定,一般来说INPLACE算法支持并发DML。

ALTER TABLE 【ALGORITHM】算法关键字可选,如省略【ALGORITHM】,MySQL尝试使用【ALGORITHM=INPLACE】,如INPLACE不支持,则使用【ALGORITHM=COPY】,类似优先策略,尽可能支持并发DML。

显式指定【ALGORITHM】需要对应的ALTER TABLE具体操作和存储引擎支持,如不支持(ALTER TABLE操作或存储引擎)会提示错误。显式指定【ALGORITHM=DEFAULT】等同于不指定【ALGORITHM】。

COPY算法

ALTER TABLE操作等待其它正在执行的修改表操作结束

然后创建表副本并应用ALTER TABLE变更到副本,逐行复制源表数据,删除源表数据结构,重命名副本为源表信息

ALTER TABLE操作执行时,源表对其他会话可读(例外1),更新和写操作挂起直至新表就绪后将挂起操作重定向至新表,创建的副本和源表在相同数据库,除非使用RENAME TO移动至另外数据库。

例外1:ALTER TABLE操作在更新.frm文件版本,数据库缓存丢弃和刷新源表数据定义信息时也会阻塞读操作,此时ALTER TABLE操作等待正在进行的会话读操作结束,再执行变更,并挂起其他会话读写操作。

COPY算法的ALTER TABLE操作阻止并发DML操作,仍允许并发查询(读)操作,就是COPY算法的并发控制至少等同与【LOCK=SHARED】,此时可进一步限制并发访问,显式指定【LOCK=EXCLUSIVE】阻塞ALTER TABLE时的读写请求。启用MySQL系统变量

old_alter_table效果等同ALGORITHM=COPY,如启用了old_alter_table变量但是ALGORITHM不为DEFAULT,则ALGORITHM优先。

posted @ 2021-08-03 18:24  棠棣~  阅读(382)  评论(0)    收藏  举报