我有两个似乎相互阻塞的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可能会获取两次之间的锁定。这两个查询之间是否有可能发生死锁的情况?
答案 0 :(得分:0)
来自How to Prevent Locks from Blocking Queries in Amazon Redshift:
AccessShareLock:在UNLOAD,SELECT,UPDATE或DELETE操作期间获取。 AccessShareLock仅阻止AccessExclusiveLock尝试。 AccessShareLock不会阻止其他试图在表上读写的会话。
表获得锁后,该锁将一直保留,直到您使用COMMIT或ROLLBACK完成事务为止。等待锁的事务可以阻止也等待获取相同锁的后续事务。这可能会导致群集上的锁排队。
奇怪的是SELECT
会引起阻塞。
如果您使用的是SQL客户端,请打开自动提交。