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

Redshift: serializable isolation error (1023) despite LOCK

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

我的管道执行以下操作:

在临时舞台上做很多事情 table。最后,通过执行以下操作将更新插入到最终 table(永久且跨进程共享):

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

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

ERROR: 1023 DETAIL: Serializable isolation violation on table - 142443, transactions > forming the cycle are: 388224, 388226 (pid:32012)

(其中 142443 是我的 table X)

当我 运行 这个过程一个接一个地进行时,一切都很顺利。我已经在其他进程中成功使用了锁(并验证它按预期工作)所以我在这里感到困惑。任何帮助表示赞赏!

这是意料之中的。 Redshift 使用的事务隔离级别是 SERIALIZABLE,如 AWS Doc

中所述

Note: READ UNCOMMITTED, READ COMMITTED, and REPEATABLE READ have no operational impact and map to SERIALIZABLE in Amazon Redshift.

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

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

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

388224transaction_id形成循环