Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aws lambda 红移:如何修复并发合并操作导致的可序列化隔离冲突(1023)?_Aws Lambda_Amazon Redshift - Fatal编程技术网

Aws lambda 红移:如何修复并发合并操作导致的可序列化隔离冲突(1023)?

Aws lambda 红移:如何修复并发合并操作导致的可序列化隔离冲突(1023)?,aws-lambda,amazon-redshift,Aws Lambda,Amazon Redshift,我的用例是从x个Lambda函数中以增量方式实时提取、转换和加载数据。我期望多个Lambda函数同时运行,并且对于读取查询,Redshift保持活动状态 由于Redshift不强制执行主键约束,所以我使用aws文档强制执行唯一行。当只有1个lambda函数实例在运行时,此方法可以正常工作 -- Start a new transaction begin transaction; -- Delete any rows from SALES that exist in STAGESALES, be

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

由于Redshift不强制执行主键约束,所以我使用aws文档强制执行唯一行。当只有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. 

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

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


由于红移工作方式中的这些限制,当前设计在缩放到多个lambda函数时无法正常工作。您需要设计一种管理lambda函数的方法,以便在同一个表上并发运行不存在冲突的DML语句。不清楚为什么要使用多个lambda函数来执行此操作,因此我无法对备选方案的外观进行评论。

您是否尝试在每个代码中锁定表,因为这将不允许其他事务修改数据?您可以为不同的lambda使用separate staging table,并并行运行合并作业,将来自它们的数据合并到最终表。

a 1023是一个可重试的错误。
如果它只是偶尔发生,你可以考虑在lambda函数中捕获它,然后再次提交查询。

这不是PostgreSQL错误消息。我将删除PostgreSQL标记,因为似乎没有连接。我使用多个lambda,因为我目前有6个源(dynamodb、s3…这将增长),我最初认为有一个1 lambda:1数据源来保持项目的独立性。每个lambda具有不同的提取和转换代码,并在随机时间被触发。当触发lambda函数时,您可能需要考虑一个作业调度系统来控制。有商业产品,或者您可以使用Cloudwatch事件来触发Step函数状态机,自己构建一些东西。请参阅