【发布时间】:2014-01-08 15:50:50
【问题描述】:
我有多个进程不断刷新 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 特殊锁定表。我认为这可行,但我想避免为我的每个表创建一个特殊的锁表。
【问题讨论】:
-
你考虑过Advisory Locks吗?
-
不幸的是,这是 Redshift 不支持的事情之一:docs.aws.amazon.com/redshift/latest/dg/…
-
以 RENAME 开头并允许读者查询它,直到该过程完成
标签: amazon-redshift