为什么这个DELETE查询会冻结DB?

问题描述 投票:0回答:1

我不明白的奇怪的事情。当运行这样的select时,:

select count(*) "factures_quantite_achats_prms" 
WHERE "factures_quantite_achats_prms"."quantite_achats_prm_id" IN (3099747, 3099746, 2979429, 2979430)

我得到了正确的结果:4行。

但当运行这个(同样的,但有删除)。

DELETE FROM "factures_quantite_achats_prms" 
WHERE "factures_quantite_achats_prms"."quantite_achats_prm_id" IN (3099747, 3099746, 2979429, 2979430)

查询冻结了

这里是删除的解释。

Delete on factures_quantite_achats_prms  (cost=0.43..23.50 rows=4 width=6)
  ->  Index Scan using factures_quantite_achats_prms__quantite_achats_prm_id__idx on factures_quantite_achats_prms  (cost=0.43..23.50 rows=4 width=6)
        Index Cond: (quantite_achats_prm_id = ANY ('{3099747,3099746,2979429,2979430}'::integer[]))

另外,当寻找锁定的表时,结果是这样的:

  pid  | usename | blocked_by |                                                                                              blocked_query                                                                                               
-------+---------+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 28097 | Project  | {14713}    | DELETE FROM "factures_quantite_achats_prms" WHERE "factures_quantite_achats_prms"."facture_id" = $1 AND "factures_quantite_achats_prms"."quantite_achats_prm_id" IN (3099747, 3099746, 2979429, 2979430)

所以结论是,DELETE查询锁定了表,但为什么?

postgresql sql-delete
1个回答
0
投票

DELETE语句不会冻结数据库,也不会以独占模式锁定表:它主要是以独占模式锁定或试图锁定所有选定的行。

如果一个DELETE查询正在等待另一个事务,很可能另一个事务已经锁定了部分行。

© www.soinside.com 2019 - 2024. All rights reserved.