Amazon redshift 单个表上的红移死锁

Amazon redshift 单个表上的红移死锁,amazon-redshift,Amazon Redshift,我正在用redshift编写一个ETL过程,我真的希望它更具并行性。该流程创建一组临时表,然后将它们合并到主表中,在一个事务中,如下所示: CREATE TEMPORARY TABLE temporary_table (LIKE production_table); BEGIN TRANSACTION; LOCK TABLE production_table; /* Dedupe and then insert */ DELETE FROM temporary_table US

我正在用redshift编写一个ETL过程,我真的希望它更具并行性。该流程创建一组临时表,然后将它们合并到主表中,在一个事务中,如下所示:

CREATE TEMPORARY TABLE temporary_table
    (LIKE production_table);

BEGIN TRANSACTION;
LOCK TABLE production_table;

/* Dedupe and then insert */
DELETE FROM temporary_table
   USING production_table
   WHERE temporary_table.id = production_table.id
       AND temporary_table.date <= production_table.date;

INSERT INTO production_table
SELECT * FROM temporary_table;

END TRANSACTION;

这发生在两个delete/insert语句之间。为什么锁表步骤不能防止死锁?我如何组织写操作,使它们阻塞,直到另一个事务完成?

我已经解决了这个问题

无论何时,生产表上都有一个隐式锁

CREATE TEMPORARY TABLE temporary_table
    (LIKE production_table)

在临时表的生存期内。我在创建临时表查询中使用了生产表的实际模式,死锁消失了。

这是一个非常糟糕的解决方案。我希望有或将有更好的解决办法。但到目前为止,这是我能找到的最好的解决办法。@hans-z,你能详细说明一下僵局的原因吗?仍然涉及单个资源(
production\u table
),当您按顺序锁定多个资源时,通常会发生死锁……是因为锁是针对每个查询而不是针对每个会话的吗?这就是为什么
re-enrancy
丢失的原因?@Alexander.fure当您创建
临时表时,
production\u table
的锁定处于一个单独的过程中。当
临时表
存在时,该锁无法释放,并且删除
临时表
的查询只有在查询
锁表生成表时才能运行运行,这会导致死锁。这里也有同样的问题。我猜这里的大多数人都有多个运行批导入的工作任务,并在中引用了针对Redshift中upserts的Amazon指南。另一个视觉上不太混乱的选项是抛出
createtemporarytable-TEMPORARY\u-TABLE(像production\u-TABLE)与生产表的删除/插入在同一块中。代价是所有操作都是按顺序发生的,并且没有并行化的机会。
CREATE TEMPORARY TABLE temporary_table
    (LIKE production_table)