AWS Redshift 可以删除包裹在事务中的 table 吗?
Can AWS Redshift drop a table that is wrapped in transaction?
在 ETL 期间,我们执行以下操作:
begin transaction;
drop table if exists target_tmp;
create table target_tmp like target;
insert into target_tmp select * from source_a inner join source_b on ...;
analyze table target_tmp;
drop table target;
alter table target_tmp rename to target;
commit;
SQL 命令由 AWS Data Pipeline 执行,如果这很重要的话。
但是,管道有时会失败并出现以下错误:
ERROR: table 111566 dropped by concurrent transaction
Redshift 支持可序列化隔离。其中一个命令会破坏隔离吗?
可以,但是如果生成临时文件 table 需要一段时间,您可能会在其他查询运行时看到该错误。您可以尝试在单独的事务中生成临时 table(除非您担心源 table 的更新,否则可能不需要事务)。然后快速轮换 table 个名字,这样争用的时间就会少得多:
-- generate target_tmp first then
begin;
alter table target rename to target_old;
alter table target_tmp rename to target;
commit;
drop table target_old;
在 ETL 期间,我们执行以下操作:
begin transaction;
drop table if exists target_tmp;
create table target_tmp like target;
insert into target_tmp select * from source_a inner join source_b on ...;
analyze table target_tmp;
drop table target;
alter table target_tmp rename to target;
commit;
SQL 命令由 AWS Data Pipeline 执行,如果这很重要的话。
但是,管道有时会失败并出现以下错误:
ERROR: table 111566 dropped by concurrent transaction
Redshift 支持可序列化隔离。其中一个命令会破坏隔离吗?
可以,但是如果生成临时文件 table 需要一段时间,您可能会在其他查询运行时看到该错误。您可以尝试在单独的事务中生成临时 table(除非您担心源 table 的更新,否则可能不需要事务)。然后快速轮换 table 个名字,这样争用的时间就会少得多:
-- generate target_tmp first then
begin;
alter table target rename to target_old;
alter table target_tmp rename to target;
commit;
drop table target_old;