在 Citus 中,如何在 COPY 期间锁定分布式 table?

In Citus, how do I lock a distributed table during a COPY?

Citus 不支持数据修改命令的多语句事务,因此无法使用LOCK命令在数据迁移过程中防止并发访问。

有什么方法可以在初始数据迁移期间锁定对 table 的访问?

尽管 Citus 确实阻止了包含修改的多语句事务,但此检查显然不适用于新的 COPY 支持。因此,如果您实际上是在执行 COPY 而不是 INSERTUPDATEDELETE,则可以使用 BEGINLOCK 来获取您想要的单写语义:

BEGIN;
LOCK target_table IN ACCESS EXCLUSIVE MODE;

COPY target_table FROM '/file/on/server';
\copy target_table from '~/local/file'

COMMIT;

如果并发会话尝试针对此 INSERTUPDATEDELETE table,它将阻塞,直到上述事务块提交。