Lists: | pgsql-ru-general |
---|
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | борьба с дедлоками |
Date: | 2013-04-28 22:07:18 |
Message-ID: | 20130428220718.GA17162@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | 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(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Миша Тюрин <tmihail(at)bk(dot)ru> |
---|---|
To: | Dmitry E(dot) Oboukhov <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-04-29 03:54:55 |
Message-ID: | 1367207695.61267644@f224.mail.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Сортировка поможет.
Понедельник, 29 апреля 2013, 2:07 +04:00 от "Dmitry E. Oboukhov" <unera(at)debian(dot)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(at)debian(dot)org jabber: //UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-07 22:34:43 |
Message-ID: | 20130507223443.GJ27021@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Сортировка поможет.
приписал в обоих запросах ORDER BY "uuid". как сыпались дедлоки так и
продолжают сыпаться.
постгря - 9.1.2
очень не хочется лочить таблицу вообще перед групповой записью.
есть еще варианты какие-либо? подскажите
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Сергей Муравьёв <smurav78(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 03:52:17 |
Message-ID: | CAOzrXHRpmUDRz93XD+8nfiF6KVkCR9MGUg0-U=w4pV_TEoDCwA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Думаю, что ORDER BY определяет только сортировку результатов, а оптимизатор
запросов может определить совсем другой порядок обработки строк.
Тут нужно пробовать блокировать таблицы целиком (
http://www.postgresql.org/docs/9.1/static/sql-lock.html)
BEGIN WORK;
LOCK TABLE objects IN EXCLUSIVE MODE;
...UPDATE
"objects"
SET
"status" = "..."
FROM
"list"
WHERE
"list"."uuid" = "objects"."uuid"
COMMIT WORK;
BEGIN WORK;
LOCK TABLE objects IN EXCLUSIVE MODE;
...UPDATE
"objects"
SET
"x" = "...", "y"="..."
FROM
"list"
WHERE
"list"."uuid" = "objects"."uuid"
COMMIT WORK;
В каждый момент времени только один процесс будет иметь возможность писать
в таблицу.
8 мая 2013 г., 2:34 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>написал:
> > Сортировка поможет.
>
> приписал в обоих запросах ORDER BY "uuid". как сыпались дедлоки так и
> продолжают сыпаться.
> постгря - 9.1.2
>
> очень не хочется лочить таблицу вообще перед групповой записью.
>
> есть еще варианты какие-либо? подскажите
> --
>
> . ''`. Dmitry E. Oboukhov
> : :' : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~' GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlGJgYMACgkQq4wAz/jiZTdE5wCgwXNqmM8xYOHfxhxT23ScdFDR
> 878AnRqCcuUy1ylSVDT6dfqJM5VAf8vz
> =gSe+
> -----END PGP SIGNATURE-----
>
>
--
С уважением
Муравьёв Сергей
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | Сергей Муравьёв <smurav78(at)gmail(dot)com> |
Cc: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org> |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 09:45:10 |
Message-ID: | CAAfz9KNK36mAHT159UzwB=hrB3Ak0yF_aoNwda_A6TzUvv=fWg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
8 мая 2013 г., 7:52 пользователь Сергей Муравьёв <smurav78(at)gmail(dot)com>написал:
> Думаю, что ORDER BY определяет только сортировку результатов, а
> оптимизатор
> запросов может определить совсем другой порядок обработки строк.
>
> Тут нужно пробовать блокировать таблицы целиком (
> http://www.postgresql.org/docs/9.1/static/sql-lock.html)
>
Или вспомнить про SELECT ... FOR UPDATE
http://www.postgresql.org/docs/9.2/static/sql-select.html#SQL-FOR-UPDATE-SHARE
--
// Dmitriy.
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
Cc: | Сергей Муравьёв <smurav78(at)gmail(dot)com>, pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org> |
Subject: | Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 10:10:50 |
Message-ID: | 20130508101050.GM27021@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Или вспомнить про SELECT ... FOR UPDATE
> http://www.postgresql.org/docs/9.2/static/sql-select.html#SQL-FOR-UPDATE-SHARE
но у него та же проблема будет
два оператора делают SELECT .. FOR UPDATE
первый выбирает записи по порядку 1 2 3 4
а второй по порядку 4 3 2 1
и на третьей записи дедлок
или я не прав?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Viacheslav N Tararin <taras(at)logicland(dot)com(dot)ua> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 11:33:20 |
Message-ID: | 518A3800.3040101@logicland.com.ua |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
У всех та же проблема.
Из проблемы есть только один выход, все таблицы во всех транзакциях
должны блокироваться в одном порядке.
08.05.2013 13:10, Dmitry E. Oboukhov пишет:
>
>> Или вспомнить про SELECT ... FOR UPDATE
>> http://www.postgresql.org/docs/9.2/static/sql-select.html#SQL-FOR-UPDATE-SHARE
>
> но у него та же проблема будет
>
> два оператора делают SELECT .. FOR UPDATE
>
> первый выбирает записи по порядку 1 2 3 4
> а второй по порядку 4 3 2 1
>
> и на третьей записи дедлок
>
> или я не прав?
--
With b/r Viacheslav N Tararin.
Abonent Logic Land http://abonent.logicland.com.ua/
Logic Land ltd. http://logicland.com.ua/
Uralska st., 8, Kamenets-Podilskiy,
Khmelnitskiy reg., 32300, Ukraine
Tel/fax: +38-03849-3-63-80
Attachment | Content-Type | Size |
---|---|---|
taras.vcf | text/x-vcard | 272 bytes |
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | Viacheslav N Tararin <taras(at)logicland(dot)com(dot)ua> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 11:57:38 |
Message-ID: | 20130508115738.GA16457@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> У всех та же проблема.
> Из проблемы есть только один выход, все таблицы во всех транзакциях
> должны блокироваться в одном порядке.
про блокировку таблиц я понимаю.
мне интересно есть ли способ блокировать _записи_ в одной таблице в
одном порядке?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Viacheslav N Tararin <taras(at)logicland(dot)com(dot)ua> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 12:11:47 |
Message-ID: | 518A4103.9070509@logicland.com.ua |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Есть. - изменения должны затрагивать только одну запись. А прядок выдачи
запросов на изменения можно задать програмно в нужном порядке. Правда об
еффективности в этом случае можно забыть.
Может на проблему с другого угла посмотреть?
08.05.2013 14:57, Dmitry E. Oboukhov пишет:
>> У всех та же проблема.
>> Из проблемы есть только один выход, все таблицы во всех транзакциях
>> должны блокироваться в одном порядке.
> про блокировку таблиц я понимаю.
> мне интересно есть ли способ блокировать _записи_ в одной таблице в
> одном порядке?
--
With b/r Viacheslav N Tararin.
Abonent Logic Land http://abonent.logicland.com.ua/
Logic Land ltd. http://logicland.com.ua/
Uralska st., 8, Kamenets-Podilskiy,
Khmelnitskiy reg., 32300, Ukraine
Tel/fax: +38-03849-3-63-80
Attachment | Content-Type | Size |
---|---|---|
taras.vcf | text/x-vcard | 272 bytes |
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 12:22:16 |
Message-ID: | 20130508122216.GE16457@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Есть. - изменения должны затрагивать только одну запись. А прядок
> выдачи запросов на изменения можно задать програмно в нужном
> порядке. Правда об еффективности в этом случае можно забыть.
> Может на проблему с другого угла посмотреть?
Да другой угол - нормализация полей по двум таблицам, либо другой угол
- блокировка таблиц - понятны. я пока (для себя по кр. мере) хочу
выяснить вопрос можно ли тут что-то сделать :)
кстати, насчет эффективности
если выдать огромную секцию
WITH
"u1" AS (UPDATE "table" SET .. WHERE id = 1 AND key = 'abc')
"u2" AS (UPDATE "table" SET .. WHERE id = 2 AND key = 'abc')
"u3" AS (UPDATE "table" SET .. WHERE id = 3 AND key = 'abc')
...
SELECT
123
;
то насколько это будет менее эффективно нежели
WITH "list" AS (SELECT ... собрать весь лист id / value )
UPDATE
"table"
SET
...
FROM
"list"
WHERE
"list"."id' = "table"."id"
первый вариант не будет дедлочиться, а вот насколько он будет менее
эффективен?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Сергей Муравьёв <smurav78(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 15:37:07 |
Message-ID: | CAOzrXHR79NuqnPNRRYmojXaouM8PDX8wJUZE3MDxUdnNRpS-mA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Думаю, первый вариант будет в разы медленнее.
Но лучше не гадать, а провести анализ запросов и замеры времени выполнения.
Тут есть информация и про анализ запросов, и про выгоду от блокировки таблиц
http://www.opennet.ru/base/dev/postgresql_tune.txt.html
8 мая 2013 г., 16:22 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>написал:
> > Есть. - изменения должны затрагивать только одну запись. А прядок
> > выдачи запросов на изменения можно задать програмно в нужном
> > порядке. Правда об еффективности в этом случае можно забыть.
> > Может на проблему с другого угла посмотреть?
>
> Да другой угол - нормализация полей по двум таблицам, либо другой угол
> - блокировка таблиц - понятны. я пока (для себя по кр. мере) хочу
> выяснить вопрос можно ли тут что-то сделать :)
>
> кстати, насчет эффективности
>
> если выдать огромную секцию
>
> WITH
> "u1" AS (UPDATE "table" SET .. WHERE id = 1 AND key = 'abc')
> "u2" AS (UPDATE "table" SET .. WHERE id = 2 AND key = 'abc')
> "u3" AS (UPDATE "table" SET .. WHERE id = 3 AND key = 'abc')
> ...
> SELECT
> 123
> ;
>
> то насколько это будет менее эффективно нежели
>
> WITH "list" AS (SELECT ... собрать весь лист id / value )
> UPDATE
> "table"
> SET
> ...
> FROM
> "list"
> WHERE
> "list"."id' = "table"."id"
>
>
> первый вариант не будет дедлочиться, а вот насколько он будет менее
> эффективен?
> --
>
> . ''`. Dmitry E. Oboukhov
> : :' : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~' GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlGKQ3gACgkQq4wAz/jiZTfINgCgnrZwwyxDiF5e/UAQxYjpj+yi
> v7IAoO1k5lA4VxvHDYNEEjWn3cYaXuwf
> =WkX3
> -----END PGP SIGNATURE-----
>
>
--
С уважением
Муравьёв Сергей
From: | Sergey Konoplev <gray(dot)ru(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | Viacheslav N Tararin <taras(at)logicland(dot)com(dot)ua>, pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org> |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] борьба с дедлоками |
Date: | 2013-05-08 17:02:46 |
Message-ID: | CAL_0b1ua0PZ_uUvrb8RY_eb+g+OznOMPS-kgm8FY-NF98xNDCA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
2013/5/8 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
>> Из проблемы есть только один выход, все таблицы во всех транзакциях
>> должны блокироваться в одном порядке.
>
> про блокировку таблиц я понимаю.
> мне интересно есть ли способ блокировать _записи_ в одной таблице в
> одном порядке?
Можно с помощью plpgsql плюс FOR SELECT ... ORDER ... LOOP UPDATE ... END LOOP.
> --
>
> . ''`. Dmitry E. Oboukhov
> : :' : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~' GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlGKPbIACgkQq4wAz/jiZTf1PgCg2aHS2Sb6XrSMevxg0RdL1mCK
> F5kAn2BI879WQFkENGXOnTmFr1kbfeth
> =ZPQY
> -----END PGP SIGNATURE-----
>
--
Kind regards,
Sergey Konoplev
PostgreSQL Consultant and DBA
Profile: http://www.linkedin.com/in/grayhemp
Phone: USA +1 (415) 867-9984, Russia +7 (901) 903-0499, +7 (988) 888-1979
Skype: gray-hemp
Jabber: gray(dot)ru(at)gmail(dot)com