我不明白的奇怪的事情。当运行这样的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查询锁定了表,但为什么?
DELETE语句不会冻结数据库,也不会以独占模式锁定表:它主要是以独占模式锁定或试图锁定所有选定的行。
如果一个DELETE查询正在等待另一个事务,很可能另一个事务已经锁定了部分行。