Ada*_*tan 7 deadlock postgresql-9.3
我使用带有PostGIS的 PostgreSQL 9.3来存储位置更新。更新写入两个表 -location_updates和location_updates_history.
每个人都有:
car_idgeom 柱子每次更新都会写入location_updates表,然后触发器函数会将相同的更新写入location_updates_history. 更新后,除最新的 10 个更新外,所有更新都car_id将被删除。因此,该location_update表以移动窗口的方式包含了每辆车的最新 10 次更新,并且该location_updates_history表包含了它的完整历史记录。
我发现我只需要每辆车的最新更新,而不是最新的 10,所以我运行以下命令:
DROP TRIGGER location_update_insertion_trigger ON location_update;
DELETE FROM location_update WHERE id NOT IN
(SELECT max(id) FROM location_update GROUP BY cat_id);
ALTER TABLE location_update DROP COLUMN id CASCADE;
ALTER TABLE location_update ADD PRIMARY KEY (car_id);
Run Code Online (Sandbox Code Playgroud)
经过几个小时的工作,数据库处于完全锁定状态 - 非常糟糕,甚至其架构上的 pg_dump 也被阻止了。
在 AWS RDS 优秀支持团队和这篇博文的帮助下,我能够绘制这种锁定模式 - 简而言之,每个人都在阻止每个人。这已经持续了好几天,只有在我手动终止调用机器上列出的进程时才会停止。
该UPDATE声明的格式如下:
UPDATE TABLE location_update SET ... WHERE car_id='car_XXX';
Run Code Online (Sandbox Code Playgroud)
该LOCK声明的格式如下:
LOCK TABLE public.location_update IN ACCESS SHARE MODE
Run Code Online (Sandbox Code Playgroud)
该SELECT语句查询location_update表。
为什么我的数据库被锁定在location_updates表上?删除数字 id 的原因是什么?修复它的正确方法是什么?