【问题标题】:Redshift: How to fix serializable isolation violation(1023) caused by concurrent MERGE operations?Redshift:如何修复并发 MERGE 操作导致的可序列化隔离违规(1023)?
【发布时间】:2019-05-21 08:36:45
【问题描述】:

我的用例是从 x 个 Lambda 函数中以增量方式实时提取、转换和加载数据。我希望多个 Lambda 函数能够同时运行,并且 Redshift 能够为读取查询保持活动状态。

由于 Redshift 不强制执行主键约束,我使用 aws 文档 Merge examples - Example of a merge that replaces existing rows 来强制执行唯一行。当只有 1 个 lambda 函数实例在运行时,此方法可以正常工作。

-- Start a new transaction
begin transaction;

-- Delete any rows from SALES that exist in STAGESALES, because they are updates
-- The join includes a redundant predicate to collocate on the distribution key 
-- A filter on saletime enables a range-restricted scan on SALES

delete from sales
using stagesales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid
and sales.saletime > '2008-11-30';

-- Insert all the rows from the staging table into the target table
insert into sales
select * from stagesales;

-- End transaction and commit
end transaction;

-- Drop the staging table
drop table stagesales;

但只要 > 1 个 lambda 函数同时运行并访问同一个表,我就会收到:

"ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift" when performing operations in a transaction concurrently with another session. 

我应该如何修改这个示例以允许它在并发环境中运行?

【问题讨论】:

  • 这不是 PostgreSQL 错误消息。我将删除 PostgreSQL 标记,因为似乎没有连接。

标签: aws-lambda amazon-redshift


【解决方案1】:

您遇到的问题是您有多个 lambda 函数同时在同一个表上执行 DML。 Redshift 不支持不是serializable 的并发事务,即尝试同时修改相同的数据。在这种情况下,Redshift 将中止一个或多个事务,以确保执行的所有 DML 都是可序列化的。

由于 Redshift 工作方式的这些限制,当扩展到多个 lambda 函数时,您当前的设计将无法正常工作。您将需要设计一种管理 lambda 函数的方法,这样就不会在同一个表上同时运行有冲突的 DML 语句。目前尚不清楚您为什么要使用多个 lambda 函数来执行此操作,因此我无法评论替代方案的外观。

【讨论】:

  • 我正在使用多个 lambda,因为我目前有 6 个源(dynamodb、s3...这会增长),我最初认为有一个 1 lambda : 1 数据源来保持项目独立应该扩展.每个 lambda 具有不同的提取和转换代码,并在随机时间触发。
  • 您可能需要考虑使用作业调度系统来控制何时触发 lambda 函数。有商业产品,或者您可以使用 Cloudwatch 事件自己构建一些东西来触发 Step Function 状态机。
【解决方案2】:

您是否尝试在每个代码中锁定表,因为这将不允许其他事务修改数据?你们都可以为不同的 lambda 设置单独的暂存表,并有一个并行运行的合并作业,它将来自它们的数据合并到最终表中。

【讨论】:

    【解决方案3】:

    1023 是可重试的错误。 如果它只是不时发生,您可以考虑在您的 lambda 函数中捕获它,然后再次提交查询。

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2021-02-08
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多