Sql Postgres:2个更新查询的死锁
我正在努力解决生产中的这个死锁问题,现在我真的需要一些帮助 PostgreSQL 9.5.10 查询1:(更新1000条记录) 查询2:(更新单个记录) 例外情况: 进程60563等待事务3603536083上的ShareLock;此 路 不通 通过过程60701。进程60701等待事务上的ShareLock 3603536039; 已被进程60563阻止 由于死锁过程中只涉及两个事务,一个更新怎么可能与另一个更新处于死锁状态。根据我的理解,在第一次更新之后,所有这些行上都会出现RowExclusiveLock,第二次更新应该会被阻止。怎么会出现僵局Sql Postgres:2个更新查询的死锁,sql,postgresql,Sql,Postgresql,我正在努力解决生产中的这个死锁问题,现在我真的需要一些帮助 PostgreSQL 9.5.10 查询1:(更新1000条记录) 查询2:(更新单个记录) 例外情况: 进程60563等待事务3603536083上的ShareLock;此 路 不通 通过过程60701。进程60701等待事务上的ShareLock 3603536039; 已被进程60563阻止 由于死锁过程中只涉及两个事务,一个更新怎么可能与另一个更新处于死锁状态。根据我的理解,在第一次更新之后,所有这些行上都会出现RowExclu
stream\u general
表格模式:
CREATE TABLE entitlements.stream_general (
stream_id int4 NOT NULL,
id varchar NOT NULL,
topic varchar NOT NULL,
stream_offset_id int8 NOT NULL DEFAULT '-1'::integer,
create_dt timestamptz NOT NULL DEFAULT now(),
update_dt timestamptz NOT NULL DEFAULT now(),
stream_action stream_action_type NOT NULL,
should_update_offset_id bool NULL,
PRIMARY KEY (stream_id, topic, id),
FOREIGN KEY (stream_id) REFERENCES entitlements.stream(stream_id) ON DELETE CASCADE
)
WITH (
OIDS=FALSE
) ;
CREATE INDEX stream_general_id_idx ON entitlements.stream_general USING btree (id, topic) ;
CREATE INDEX stream_general_should_update_offset_id_index ON entitlements.stream_general USING btree (should_update_offset_id) ;
CREATE INDEX stream_general_stream_id_idx ON entitlements.stream_general USING btree (stream_id, topic, stream_offset_id) ;
注意:stream_id是外键
我能想到的唯一罪魁祸首是Query1中的子查询,但我怎么也弄不清楚这个选择是如何产生问题的。或者可能是由于国外的限制 第一个查询首先获取读取锁,然后再获取写入锁。当第二个查询也在等待写锁时,这会导致死锁吗 是否尝试让子查询获取写锁
update ...
from (
select ...
from ...
FOR UPDATE
) sg2
是的,使用
进行更新是我的第一个想法。但在我不确定是什么导致了僵局之前,我不想继续进行修复。此外,您的建议查询错误,因为我们无法在更新查询中使用限制。对,建议查询已删除。
CREATE TABLE entitlements.stream_general (
stream_id int4 NOT NULL,
id varchar NOT NULL,
topic varchar NOT NULL,
stream_offset_id int8 NOT NULL DEFAULT '-1'::integer,
create_dt timestamptz NOT NULL DEFAULT now(),
update_dt timestamptz NOT NULL DEFAULT now(),
stream_action stream_action_type NOT NULL,
should_update_offset_id bool NULL,
PRIMARY KEY (stream_id, topic, id),
FOREIGN KEY (stream_id) REFERENCES entitlements.stream(stream_id) ON DELETE CASCADE
)
WITH (
OIDS=FALSE
) ;
CREATE INDEX stream_general_id_idx ON entitlements.stream_general USING btree (id, topic) ;
CREATE INDEX stream_general_should_update_offset_id_index ON entitlements.stream_general USING btree (should_update_offset_id) ;
CREATE INDEX stream_general_stream_id_idx ON entitlements.stream_general USING btree (stream_id, topic, stream_offset_id) ;
update ...
from (
select ...
from ...
FOR UPDATE
) sg2