Redshift: Как исправить сериализованное нарушение изоляции (1023), вызванное одновременными операциями MERGE? - PullRequest
0 голосов
/ 20 декабря 2018

Мой вариант использования заключается в том, чтобы извлекать, преобразовывать и загружать данные постепенно и в режиме реального времени из x числа функций Lambda.Я ожидаю, что несколько функций Lambda будут работать одновременно, а Redshift останется в живых для запросов на чтение.

Поскольку Redshift не применяет ограничения первичного ключа (-ей), я использую документацию aws Примеры слияния - Примерслияния, которое заменяет существующие строки для обеспечения уникальных строк.Этот метод отлично работает, когда работает только 1 экземпляр лямбда-функции.

-- 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 лямбда-функция будет запущена одновременно и получит доступ к той же таблице, я получу:

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

Как мне изменить этот пример, чтобы он мог работать в параллельной среде?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

вы пробовали блокировать таблицу в каждом коде, так как это не позволит другой транзакции изменить данные?У всех вас может быть отдельная промежуточная таблица для разных лямбд и задание слияния, выполняемое параллельно, которое объединяет данные из них и объединяет их в финальную таблицу.

0 голосов
/ 21 декабря 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что у вас есть несколько лямбда-функций, выполняющих DML для одной и той же таблицы одновременно.Redshift не поддерживает параллельные транзакции, которые не сериализуемые , то есть которые пытаются изменить те же данные в то же время.В этом сценарии Redshift прервет одну или несколько транзакций, чтобы гарантировать, что все выполняемые DML являются сериализуемыми.

Ваш текущий дизайн не будет работать должным образом при масштабировании до более чем одной лямбда-функции из-за этих ограничений вкак работает Redshift.Вам нужно будет разработать метод управления лямбда-функциями, чтобы не было конфликтующих операторов DML, выполняемых одновременно в одной и той же таблице.Непонятно, почему вы используете для этого несколько лямбда-функций, поэтому я не могу комментировать, как будет выглядеть альтернатива.

...