борьба с дедлоками - Mailing list pgsql-ru-general

From Dmitry E. Oboukhov
Subject борьба с дедлоками
Date
Msg-id 20130428220718.GA17162@vdsl.uvw.ru
Whole thread Raw
List pgsql-ru-general
имеется табличка

objects: uuid - status - x - y - ...

далее по двум путям в эту табличку приходят статусы объектов (один
путь), а по другому пути приходят координаты объектов (второй путь)


соответственно поскольку оба потока довольно большие, то оба процесса
обновляют (они и получают) табличку пакетами.

то есть формируется некий запрос вида

WITH "list" AS (
    SELECT
        "column1" AS "uuid",
        "column2" AS "status"
    FROM (
        VALUES
            ( 'uuid1', 'status1' ),
            ( 'uuid2', 'status2' ),
            ...
    ) t
)
UPDATE
    "objects"
SET
    "status" = "list"."status"
FROM
    "list"
WHERE
    "list"."uuid" = "objects"."uuid"


аналогичный запрос составляется и по приходящим координатам (x, y).

Далее. Периодически возникают дедлоки. и оно понятно почему:

один процесс идет и меняет стасусы объектам 1 - 2 - 3 - 4
а второй процесс меняет координаты объектам 4 - 3 - 2 - 1

и когда оба доходят до третьего шага у обоих получаются залочены те
объекты на которые соседнему процессу надо получить блокировку.

вопрос: как избавиться от дедлока но сохранить пакетные запросы?

по идее если бы все процессы всегда обновляли бы записи строго в
одинаковом порядке (всегда 1-2-3-4) то, очевидно, дедлока бы не было.

но можно ли обеспечить это при групповом запросе?
поможет ли тут сортировка в [псевдо]таблице "list"?

--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment

pgsql-ru-general by date:

Previous
From: Alexander Law
Date:
Subject: Перевод документации PostgreSQL
Next
From: Миша Тюрин
Date:
Subject: Re: [pgsql-ru-general] борьба с дедлоками