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

pco*_*net 7 etl amazon-redshift

我在Redshift集群上并行运行了几个批处理ETL操作.

我的管道执行以下操作:

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

BEGIN;
LOCK table X;
DELETE FROM X USING stage_table...
INSERT INTO X ...
END;
Run Code Online (Sandbox Code Playgroud)

但是,当我有几个并行的进程时,有些失败了:

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

(142443是我的桌子X)

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

isa*_*zan 8

这是预期的。如AWS Doc 中明确所述,Redshift 使用的事务隔离级别是可序列化的

注意: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;
Run Code Online (Sandbox Code Playgroud)

388224 形成循环的transaction_id。