Amazon redshift 单个表上的红移死锁
我正在用redshift编写一个ETL过程,我真的希望它更具并行性。该流程创建一组临时表,然后将它们合并到主表中,在一个事务中,如下所示: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
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)