问题:有一个超过9000行的表。必须清理它,但没有任何锁(活动使用的表)。我尝试使用pg_advisory_unlock_all,但没有结果。
select pg_advisory_unlock_all();
start transaction();
delete from table where id='1';
DELETE 1
start transaction();
delete from table where id='1';
(waiting for finish first transaction)
答案 0 :(得分:1)
如果不锁定要删除的行,则无法从表中删除数据。
只要并发访问不会尝试修改这些行或使用id = '1'
插入新行,这不应该是一个问题,因为编写者永远不会阻塞读者,反之亦然。 / p>
如果并发事务不断修改要删除的行,那有点好笑(为什么要删除所需的数据?)。你必须等待独占锁,你可能会遇到死锁。在这种情况下,最好在开始之前使用LOCK
语句锁定整个表。从表中删除那么小的时间应该只需要很短的时间。