如果我们执行alter query(如添加约束或添加列)或更新列,Postgres会挂起并继续处理查询,从而使用永无止境的时间。
我们必须明确地终止查询。
为什么我们的ALTER
语句经常被卡住?
答案 0 :(得分:2)
这种查询有两种情况会长时间挂起:
这样的ALTER TABLE
将需要对表进行ACCESS EXCLUSIVE
锁定,这将阻止所有并发活动,并将被所有并发活动阻止。
锁定请求将在等待该表锁定的事务队列的末尾排队,因此如果这些很多并且需要很长时间才能完成,ALTER TABLE
将不得不等待很久。稍后在该表上请求锁定的其他事务也将挂起,因为它们在ALTER TABLE
语句之后排队。
请注意,“transacrion中空闲”或预准备语句的会话可能会持有很长时间的锁定。留下这些东西是错误的。
许多形式的ALTER TABLE
必须重写表(例如,如果添加了具有非NULL默认值的新行)或扫描整个表(例如,如果添加了约束) ,必须检查每一行。
如果表格很大,这可能需要很长时间才能完成。
要消除这两种情况之间的歧义,请查看pg_locks
系统视图中的锁。