我有多个进程在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;
Run Code Online (Sandbox Code Playgroud)
我有几十个表,我以这种方式更新.这很好但我希望有多个进程执行这些表更新以实现冗余,并确保数据相当新鲜(不同的进程可以同时更新不同表的数据).
它工作正常,除非一个进程尝试刷新另一个进程正在处理的表.在这种情况下,第二个进程被第一个进程阻塞,直到它提交,并且当它提交时,第二个进程得到错误:
错误:表12345由并发事务丢弃
有一种简单的方法可以保证我的进程中只有一个正在刷新表,这样第二个进程就不会进入这种情况吗?
我考虑为每个真实表创建一个特殊的锁表.在处理LOCK伴随真实表之前,该过程将使用特殊锁定表.我认为这会有效,但我想避免为每个表创建一个特殊的锁表.
小智 9
你需要保护读者不要看到掉落,通过以下方式做到这一点:
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
| 归档时间: |
|
| 查看次数: |
4945 次 |
| 最近记录: |