红移中可能出现死锁

时间:2019-08-01 23:54:16

标签: amazon-web-services amazon-redshift deadlock

我有两个似乎相互阻塞的redshift查询,所以我怀疑可能存在死锁

query1,它是ETL管道中的查询

DROP TABLE IF EXISTS temp_table;
CREATE TABLE temp_table AS SELECT * FROM sometable;
BEGIN;
ALTER TABLE table_a RENAME TO temp_old_table;
ALTER TABLE temp_table RENAME TO table_a;
END;
DROP TABLE IF EXISTS temp_old_table;

query2是临时查询;

select * from table_a;

query1和query2同时运行。不确定哪个查询先运行。但是无论出于何种原因,两个查询都会卡住。 这是pg_locks中的锁定情况: query2在table_a上具有AccessShareLock,授予true query1正在等待table_a上的AccessExclusiveLock,授予false

由于query2已经具有AccessShareLock,因此它应该可以继续前进,而query1也应该完成。

这个地方看起来很可疑,因为query1不是单个事务。它可能尝试获取两次锁定,而query2可能会获取两次之间的锁定。这两个查询之间是否有可能发生死锁的情况?

1 个答案:

答案 0 :(得分:0)

来自How to Prevent Locks from Blocking Queries in Amazon Redshift

  

AccessShareLock:在UNLOAD,SELECT,UPDATE或DELETE操作期间获取。 AccessShareLock仅阻止AccessExclusiveLock尝试。 AccessShareLock不会阻止其他试图在表上读写的会话。

     

表获得锁后,该锁将一直保留,直到您使用COMMIT或ROLLBACK完成事务为止。等待锁的事务可以阻止也等待获取相同锁的后续事务。这可能会导致群集上的锁排队。

奇怪的是SELECT会引起阻塞。

如果您使用的是SQL客户端,请打开自动提交。