Postgresql 在Citus中,如何在复制期间锁定分布式表?
Citus不支持数据修改命令的多语句事务,因此无法使用Postgresql 在Citus中,如何在复制期间锁定分布式表?,postgresql,citus,Postgresql,Citus,Citus不支持数据修改命令的多语句事务,因此无法使用LOCK命令来防止数据迁移期间的并发访问 在初始数据迁移期间,有没有办法锁定对表的访问?尽管Citus确实阻止了包含修改的多语句事务,但此检查显然不适用于新的复制支持。因此,如果您实际执行的是复制,而不是插入、更新或删除,则可以使用开始和锁定来获得所需的单写语义: BEGIN; LOCK target_table IN ACCESS EXCLUSIVE MODE; COPY target_table FROM '/file/on/serve
LOCK
命令来防止数据迁移期间的并发访问
在初始数据迁移期间,有没有办法锁定对表的访问?尽管Citus确实阻止了包含修改的多语句事务,但此检查显然不适用于新的
复制
支持。因此,如果您实际执行的是复制
,而不是插入
、更新
或删除
,则可以使用开始
和锁定
来获得所需的单写语义:
BEGIN;
LOCK target_table IN ACCESS EXCLUSIVE MODE;
COPY target_table FROM '/file/on/server';
\copy target_table from '~/local/file'
COMMIT;
如果并发会话尝试对该表执行
插入
、更新
、或删除
,它将一直阻止,直到提交上述事务块。当我尝试执行此操作时,我遇到了一个问题,即只有检查和复制
仍然不使用事务。因此,如果我在您的示例中决定ROLLBACK
,部分迁移的数据将不会回滚。我理解的对吗?我不是100%确定,但我相信描述是准确的。COPY
本身可以是原子的,但我们(目前)不会将周围的事务命令传播给工作人员。