Re: [pgsql-ru-general] борьба с дедлоками
От | Миша Тюрин |
---|---|
Тема | Re: [pgsql-ru-general] борьба с дедлоками |
Дата | |
Msg-id | 1367207695.61267644@f224.mail.ru обсуждение исходный текст |
Ответы |
Re: Re: [pgsql-ru-general] борьба с дедлоками
|
Список | pgsql-ru-general |
Сортировка поможет. Понедельник, 29 апреля 2013, 2:07 +04:00 от "Dmitry E. Oboukhov" <unera@debian.org>: > имеется табличка 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 >
В списке pgsql-ru-general по дате отправления: