我是 Postgres 新手(由于平台限制而使用 15),并考虑将 enum 作为列类型。
将来,当我运行
ALTER TYPE name ADD VALUE ...
为枚举添加值时,它是否会获取任何类型的锁?
如果是的话,它获得什么样的锁?大概能保存多久?
您将在枚举上获得
ExclusiveLock
,直到您提交正在运行 ALTER TYPE my_enum ADD VALUE
的事务:演示。
create type my_enum as enum('first','second');
begin;
select relation::regclass,objid::regtype,locktype,mode from pg_locks;
关系 | 对象 | 锁型 | 模式 |
---|---|---|---|
pg_locks | 空 | 关系 | 访问共享锁 |
空 | 空 | 虚拟xid | 排他锁 |
空 | 空 | 交易ID | 排他锁 |
alter type my_enum add value 'third' after 'second';
select relation::regclass,objid::regtype,locktype,mode from pg_locks;
关系 | 对象 | 锁型 | 模式 |
---|---|---|---|
pg_locks | 空 | 关系 | 访问共享锁 |
空 | 空 | 虚拟xid | 排他锁 |
空 | 我的枚举 | 物体 | 排他锁 |
空 | 空 | 交易ID | 排他锁 |
它的作用是阻止任何其他事务对类型进行
alter
ing/drop
ping,因此,如果您的计划是继续大量添加和删除值,那么它可能会成为瓶颈。否则,在 alter
期间,其他人都可以继续创建使用它的关系并进行涉及该类型的操作。