【问题标题】:Redshift: serializable isolation error (1023) despite LOCKRedshift:尽管有LOCK,但可序列化的隔离错误(1023)
【发布时间】:2015-07-27 16:56:44
【问题描述】:

我正在我的 Redshift 集群上并行运行多个批处理 ETL 操作。

我的管道执行以下操作:

在临时临时表上做一堆东西。最后,通过执行以下操作将插入到最终表(永久和跨进程共享)中:

BEGIN;
LOCK table X;
DELETE FROM X USING stage_table...
INSERT INTO X ...
END;

不过,当我有多个并行进程时,有些会失败:

错误:1023 详细信息:表上的可序列化隔离违规 - 142443,事务 > 形成循环是:388224、388226 (pid:32012)

(其中 142443 是我的表 X)

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

【问题讨论】:

  • 为什么使用 INSERT 而不是 COPY?将 ETL 重新设计为更多 ELT 并使用 COPY 和内部 Redshift 查询可能会更好,从而获得比传统的旧 ETL 流程更快的摄取速度。
  • 我的 ETL 分类实际上有点误导。这些是基于 Redshift 中已有数据的派生计算。在那里使用 COPY 似乎仍然有意义吗?
  • 嘿,运气好吗?我只是在执行相同的步骤并得到相同的错误..
  • 不,仍然有同样的问题。我进行了很多更改,使其频率降低了很多,但仍然没有运气。
  • 实际上,如果这有帮助,我已经意识到大多数时候,读取时会引发错误。例如如果您对可能在 SELECT 发生时更新的表执行 SELECT,则应在执行 SELECT 之前尝试锁定该表。

标签: amazon-redshift etl


【解决方案1】:

这是意料之中的。 Redshift 使用的事务隔离级别是 SERIALIZABLE,正如AWS Doc 中明确说明的那样

注意:READ UNCOMMITTED、READ COMMITTED 和 REPEATABLE READ 没有 运营影响并映射到 Amazon Redshift 中的 SERIALIZABLE。

具体来说这意味着如果你并行运行非SERIALIZABLE的SQL语句(可以以任何顺序运行,没有结果差异),你会得到隔离级别错误。

顺便说一下,R​​edshift 为您提供了找出哪些查询存在冲突的工具。使用您在上述日志消息中获得的数字,您可以进行如下查询:

select query, trim(querytxt) as sqlquery from stl_query where xid = 388224;

388224 形成循环的 transaction_id。

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 2019-05-21
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多