我在Redshift集群上并行运行多个批处理ETL操作。
我的管道执行以下操作:
在临时登台牌上做一堆东西。最后,通过执行以下操作,进入最终表(永久和跨进程共享):
BEGIN;
LOCK table X;
DELETE FROM X USING stage_table...
INSERT INTO X ...
END;
但是,当我并行处理多个进程时,有些进程失败了:
错误:1023 DETAIL:表格中的可序列化隔离违规 - 142443,交易>形成循环的是:388224,388226(pid:32012)
(其中142443是我的桌子X)
当我一个接一个地运行这个过程时,一切都像魅力一样。我在其他进程上成功使用了锁(并验证它是按预期工作的)所以我很困惑。任何帮助表示赞赏!
答案 0 :(得分:4)
这是预期的。 Redshift使用的事务隔离级别是SERIALIZABLE,如AWS Doc
中明确规定的那样注意:READ UNCOMMITTED,READ COMMITTED和REPEATABLE READ没有 操作影响并映射到Amazon Redshift中的SERIALIZABLE。
具体来说,这意味着如果您并行运行不是SERIALIZABLE的SQL语句(可以以任何顺序运行而没有结果差异),您将获得隔离级别错误。
顺便说一句,Redshift为您提供工具来确定哪些查询存在冲突。使用您在上面的日志消息中获得的数字,您可以查询如下:
select query, trim(querytxt) as sqlquery from stl_query where xid = 388224;
388224构成循环的transaction_id。