Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Citus中,如何在复制期间锁定分布式表?_Postgresql_Citus - Fatal编程技术网

Postgresql 在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

Citus不支持数据修改命令的多语句事务,因此无法使用
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
本身可以是原子的,但我们(目前)不会将周围的事务命令传播给工作人员。