如何确保正在替换的表上的同步DDL操作?

 lixinleslee 发布于 2023-02-09 09:30

我有多个进程在Redshift中不断刷新数据.他们启动一个事务,创建一个新表,COPY将S3中的所有数据放入新表中,然后删除旧表并将新表重命名为旧表.

伪代码:

start transaction;
create table foo_temp;
copy into foo_temp from S3;
drop table foo;
rename table foo_temp to foo;
commit;

我有几十个表,我以这种方式更新.这很好但我希望有多个进程执行这些表更新以实现冗余,并确保数据相当新鲜(不同的进程可以同时更新不同表的数据).

它工作正常,除非一个进程尝试刷新另一个进程正在处理的表.在这种情况下,第二个进程被第一个进程阻塞,直到它提交,并且当它提交时,第二个进程得到错误:

错误:表12345由并发事务丢弃

有一种简单的方法可以保证我的进程中只有一个正在刷新表,这样第二个进程就不会进入这种情况吗?

我考虑为每个真实表创建一个特殊的锁表.在处理LOCK伴随真实表之前,该过程将使用特殊锁定表.我认为这会有效,但我想避免为每个表创建一个特殊的锁表.

1 个回答
  • 你需要保护读者不要看到掉落,通过以下方式做到这一点:

    开始交易

    将主表重命名为old_main_table

    将tmp表重命名为主表

    承诺

    drop table old_main_table

     
        Conn #1         Conn #2
        --------------  ------------------------------------------
                        > create table bar (id int,id2 int,id3 int);
                        CREATE TABLE
        > begin;
        BEGIN
                        > begin;
                        BEGIN
                        > alter table bar rename to bar2;
                        ALTER TABLE
        > select * from bar;  
                        > create table bar (id int,id2 int,id3 int,id4 int);
                        CREATE TABLE
                        > commit; drop table bar2;
                        COMMIT
        id | id2 | id3 
        ----+-----+-----
        (0 rows)
        > commit;
        COMMIT
                        DROP TABLE
    

    2023-02-09 09:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有