[英]why postgres takes an Access Exclusive Lock in many alter table commands?
这是postgres的最新发行版代码(链接在此处 ):
switch (cmd->subtype)
{
/*
* These subcommands rewrite the heap, so require full locks.
*/
case AT_AddColumn: /* may rewrite heap, in some cases and visible
* to SELECT */
case AT_SetTableSpace: /* must rewrite heap */
case AT_AlterColumnType: /* must rewrite heap */
case AT_AddOids: /* must rewrite heap */
cmd_lockmode = AccessExclusiveLock;
break;
从PostgreSQL 9.4开始,我们有了目录MVCC。 我的问题是:为什么在执行alter table命令时必须采取最高的锁定级别? 代码中的注释说:“这些子命令重写堆,因此需要完全锁定。” 我不明白
据我所知,大多数ALTER TABLE
语句都需要ACCESS EXCLUSIVE
锁,因为与目录有关的并非所有内容都严格是MVCC。
通常,该锁很短,您不会注意到它。
有些变体必须重写整个表,因为它们会更改磁盘结构,例如:
数据类型更改为具有不同内部表示形式的类型
直到v11,如果表中添加了带有DEFAULT
值的NOT NULL
列,我们必须重写表
正在进行减少锁的努力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.