Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:2个更新查询的死锁_Sql_Postgresql - Fatal编程技术网

Sql Postgres:2个更新查询的死锁

Sql Postgres:2个更新查询的死锁,sql,postgresql,Sql,Postgresql,我正在努力解决生产中的这个死锁问题,现在我真的需要一些帮助 PostgreSQL 9.5.10 查询1:(更新1000条记录) 查询2:(更新单个记录) 例外情况: 进程60563等待事务3603536083上的ShareLock;此 路 不通 通过过程60701。进程60701等待事务上的ShareLock 3603536039; 已被进程60563阻止 由于死锁过程中只涉及两个事务,一个更新怎么可能与另一个更新处于死锁状态。根据我的理解,在第一次更新之后,所有这些行上都会出现RowExclu

我正在努力解决生产中的这个死锁问题,现在我真的需要一些帮助

PostgreSQL 9.5.10

查询1:(更新1000条记录)

查询2:(更新单个记录)

例外情况:

进程60563等待事务3603536083上的ShareLock;此 路 不通 通过过程60701。进程60701等待事务上的ShareLock 3603536039; 已被进程60563阻止

由于死锁过程中只涉及两个事务,一个更新怎么可能与另一个更新处于死锁状态。根据我的理解,在第一次更新之后,所有这些行上都会出现RowExclusiveLock,第二次更新应该会被阻止。怎么会出现僵局

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