Redshift:尽管有LOCK,但仍可序列化隔离错误(1023)

时间:2015-05-15 17:05:44

标签: amazon-redshift etl

我在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)

当我一个接一个地运行这个过程时,一切都像魅力一样。我在其他进程上成功使用了锁(并验证它是按预期工作的)所以我很困惑。任何帮助表示赞赏!

1 个答案:

答案 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。