powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Deadlock priority
16 сообщений из 16, страница 1 из 1
Deadlock priority
    #39283819
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У одного клиента возникает неприятная ситуация. Есть две операции, каждая из которых выполняет значительный объем update'ов, причем по определенным причинам в недетерминированном порядке. Это приводит к dead-lock'ам, видя которые СУБД перестартует одну из транзакций. Но при этом получается следующая ситуация : первая транзакция дедлочит вторую, вторая перестартует, опять попадает в дедлок с первой и на этот раз постгрес перестартует первую, она в свою очередь дедлочит вторую и так по кругу (то есть в логе я вижу по 25 дедлоков у каждого процесса). Соответственно вопрос:

1) Какой приоритет по умолчанию при выборе жертвы дедлока?

2) Можно ли как-то управлять этим приоритетом? То есть скажем выбирать жертвой самую юную транзакцию (собственно это самое логично поведение, непонятно почему оно не используется).

ЗЫ: В гугле практически ничего нет, все ссылки на MS SQL, где для дедлоков кучу настроек, но там и понятно что проблема острее, блокировочник как никак.
...
Рейтинг: 0 / 0
Deadlock priority
    #39283845
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вам всё равно можно убивать транзакцию, то есть устраивает последовательная, а не конкурентная работа, то может последовательную работу и сделать? Получить, например, advisory lock в начале транзакции, сделать всё что нужно, дать поработать следующему потоку.
https://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
...
Рейтинг: 0 / 0
Deadlock priority
    #39283894
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieУ одного клиента возникает неприятная ситуация. Есть две операции, каждая из которых выполняет значительный объем update'ов, причем по определенным причинам в недетерминированном порядке. Это приводит к dead-lock'ам, видя которые СУБД перестартует одну из транзакций. Но при этом получается следующая ситуация : первая транзакция дедлочит вторую, вторая перестартует, опять попадает в дедлок с первой и на этот раз постгрес перестартует первую, она в свою очередь дедлочит вторую и так по кругу (то есть в логе я вижу по 25 дедлоков у каждого процесса). Соответственно вопрос:

1) Какой приоритет по умолчанию при выборе жертвы дедлока?

2) Можно ли как-то управлять этим приоритетом? То есть скажем выбирать жертвой самую юную транзакцию (собственно это самое логично поведение, непонятно почему оно не используется).

ЗЫ: В гугле практически ничего нет, все ссылки на MS SQL, где для дедлоков кучу настроек, но там и понятно что проблема острее, блокировочник как никак.

begin;
set local deadlock_timeout to '60s';
ваша транзакция...
...
commit;

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


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Deadlock priority
    #39283899
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijЕсли вам всё равно можно убивать транзакцию, то есть устраивает последовательная, а не конкурентная работа, то может последовательную работу и сделать? Получить, например, advisory lock в начале транзакции, сделать всё что нужно, дать поработать следующему потоку.
https://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Потому что заранее не известно, будет dead lock или нет.
...
Рейтинг: 0 / 0
Deadlock priority
    #39283902
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukNitro_JunkieУ одного клиента возникает неприятная ситуация. Есть две операции, каждая из которых выполняет значительный объем update'ов, причем по определенным причинам в недетерминированном порядке. Это приводит к dead-lock'ам, видя которые СУБД перестартует одну из транзакций. Но при этом получается следующая ситуация : первая транзакция дедлочит вторую, вторая перестартует, опять попадает в дедлок с первой и на этот раз постгрес перестартует первую, она в свою очередь дедлочит вторую и так по кругу (то есть в логе я вижу по 25 дедлоков у каждого процесса). Соответственно вопрос:

1) Какой приоритет по умолчанию при выборе жертвы дедлока?

2) Можно ли как-то управлять этим приоритетом? То есть скажем выбирать жертвой самую юную транзакцию (собственно это самое логично поведение, непонятно почему оно не используется).

ЗЫ: В гугле практически ничего нет, все ссылки на MS SQL, где для дедлоков кучу настроек, но там и понятно что проблема острее, блокировочник как никак.

begin;
set local deadlock_timeout to '60s';
ваша транзакция...
...
commit;

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


--
Maxim Boguk
www.postgresql-consulting.ru

А она точно scope'та к текущему соединению? Но вообще идея интересная, спасибо, будем пробовать.
...
Рейтинг: 0 / 0
Deadlock priority
    #39283910
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieMaxim Bogukпропущено...


begin;
set local deadlock_timeout to '60s';
ваша транзакция...
...
commit;

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


--
Maxim Boguk
www.postgresql-consulting.ru

А она точно scope'та к текущему соединению? Но вообще идея интересная, спасибо, будем пробовать.

alter system - глобальная смена настроек
set - к текущему соединению
set local - к текущей транзакции

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Deadlock priority
    #39283924
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukNitro_Junkieпропущено...


А она точно scope'та к текущему соединению? Но вообще идея интересная, спасибо, будем пробовать.

alter system - глобальная смена настроек
set - к текущему соединению
set local - к текущей транзакции

--
Maxim Boguk
www.postgresql-consulting.ru

Не, я к тому что не все же настройки можно так scope'ить. И непонятно как определить какие настройки можно переопределять для соединения, а какие нет.
...
Рейтинг: 0 / 0
Deadlock priority
    #39284031
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

см. поле context в pg_settings .
...
Рейтинг: 0 / 0
Deadlock priority
    #39284226
PgSQLanonymous2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukу какой транзакции deadlock_timeout выше у той и приоритет выше (т.е. ее не будут стрелять пока все с меньшим не пристрелят).
костыль конечно но работающий воспроизводимо.


Но "Only superusers can change this setting." Так что для общего применения как-то не очень...
...
Рейтинг: 0 / 0
Deadlock priority
    #39284230
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLanonymous2Maxim Bogukу какой транзакции deadlock_timeout выше у той и приоритет выше (т.е. ее не будут стрелять пока все с меньшим не пристрелят).
костыль конечно но работающий воспроизводимо.


Но "Only superusers can change this setting." Так что для общего применения как-то не очень...

Как вариант workaround сделать security definer функцию которая будет этот самый setting менять.
Я почти уверен что это сработает (но проверять лениво).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Deadlock priority
    #39284236
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukPgSQLanonymous2Но "Only superusers can change this setting." Так что для общего применения как-то не очень...
Как вариант workaround сделать security definer функцию которая будет этот самый setting менять.
Я таким образом делал доступ ко всем записям из `pg_stat_activity` для текущей базы, должно сработать.
Также, функции можно повесить свои настройки через `SET`, возможно и security definer не понадобиться.
...
Рейтинг: 0 / 0
Deadlock priority
    #39284272
PgSQLanonymous2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukКак вариант workaround сделать security definer функцию которая будет этот самый setting менять.
Я почти уверен что это сработает (но проверять лениво).

Да, сработает (проверил), спасибо.
...
Рейтинг: 0 / 0
Deadlock priority
    #39284325
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLanonymous2Maxim Bogukу какой транзакции deadlock_timeout выше у той и приоритет выше (т.е. ее не будут стрелять пока все с меньшим не пристрелят).
костыль конечно но работающий воспроизводимо.


Но "Only superusers can change this setting." Так что для общего применения как-то не очень...

Ну тут особой проблемы нет, так как работа идет через сервер приложений. То есть предполагается, что security на его уровне обеспечивается. Хотя да, в общем случае наверное не правильно.

Тут на самом деле другая проблема, не понятно какие транзакции приоритетные, а какие нет. То есть в идеале хотелось бы, чтобы просто более старые транзакции были приоритетнее (хотя конечно в будущем возможно и имеет смысл для отдельных пользователей перегружать приоритет). Поэтому пока сделали так: перед каждым DML берется время с начала транзакции, логарифмируется по основание 2 (то есть берутся только 1, 2, 4, 8 и т.п. секунд, делается это чтобы ограничить линейно количество установки deadlock_timeout, мало ли какие там оверхеды), и соответственно когда новый порог достигнут устанавливается новый deadlock_timeout (соотвественно 1,2,4, 8 и т.п. с).

Главный вопрос как будет постгрес реагировать на изменение deadlock_timeout походу транзакции. Во всяком случае по исходникам это не очевидно. Но сегодня-завтра это уйдет в продакшн и будем наблюдать :)
...
Рейтинг: 0 / 0
Deadlock priority
    #39284361
PgSQLanonymous2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_JunkieНу тут особой проблемы нет, так как работа идет через сервер приложений. То есть предполагается, что security на его уровне обеспечивается. Хотя да, в общем случае наверное не правильно.

Я в эту тему в основном из-за этого влез, извините...

Nitro_JunkieТут на самом деле другая проблема, не понятно какие транзакции приоритетные, а какие нет. То есть в идеале хотелось бы, чтобы просто более старые транзакции были приоритетнее (хотя конечно в будущем возможно и имеет смысл для отдельных пользователей перегружать приоритет). Поэтому пока сделали так: перед каждым DML берется время с начала транзакции, логарифмируется по основание 2 (то есть берутся только 1, 2, 4, 8 и т.п. секунд, делается это чтобы ограничить линейно количество установки deadlock_timeout, мало ли какие там оверхеды), и соответственно когда новый порог достигнут устанавливается новый deadlock_timeout (соотвественно 1,2,4, 8 и т.п. с).

Главный вопрос как будет постгрес реагировать на изменение deadlock_timeout походу транзакции. Во всяком случае по исходникам это не очевидно. Но сегодня-завтра это уйдет в продакшн и будем наблюдать :)
А по Вашему вопросу: по идее, deadlock_timeout Вам совсем не поможет, просто будет так:
1. Давно выполняющаяся транзакция A накладывает какие-то locks.
2. Тут приходит транзакция B с коротким deadlock_timeout, накладывает какие-то locks, и блокируется на каком-то lock, ранее наложенном A.
3. У B истекает deadlock_timeout, она проверяет DEADLOCK-и (а их нет) и продолжает ждать (вечно).
4. A пытается наложить lock на какой-то из ресурсов, захваченных B, блокируется, выжидает свой deadlock_timeout, откатывается.
...
Рейтинг: 0 / 0
Deadlock priority
    #39284404
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLanonymous2Nitro_JunkieНу тут особой проблемы нет, так как работа идет через сервер приложений. То есть предполагается, что security на его уровне обеспечивается. Хотя да, в общем случае наверное не правильно.

Я в эту тему в основном из-за этого влез, извините...

Nitro_JunkieТут на самом деле другая проблема, не понятно какие транзакции приоритетные, а какие нет. То есть в идеале хотелось бы, чтобы просто более старые транзакции были приоритетнее (хотя конечно в будущем возможно и имеет смысл для отдельных пользователей перегружать приоритет). Поэтому пока сделали так: перед каждым DML берется время с начала транзакции, логарифмируется по основание 2 (то есть берутся только 1, 2, 4, 8 и т.п. секунд, делается это чтобы ограничить линейно количество установки deadlock_timeout, мало ли какие там оверхеды), и соответственно когда новый порог достигнут устанавливается новый deadlock_timeout (соотвественно 1,2,4, 8 и т.п. с).

Главный вопрос как будет постгрес реагировать на изменение deadlock_timeout походу транзакции. Во всяком случае по исходникам это не очевидно. Но сегодня-завтра это уйдет в продакшн и будем наблюдать :)
А по Вашему вопросу: по идее, deadlock_timeout Вам совсем не поможет, просто будет так:
1. Давно выполняющаяся транзакция A накладывает какие-то locks.
2. Тут приходит транзакция B с коротким deadlock_timeout, накладывает какие-то locks, и блокируется на каком-то lock, ранее наложенном A.
3. У B истекает deadlock_timeout, она проверяет DEADLOCK-и (а их нет) и продолжает ждать (вечно).
4. A пытается наложить lock на какой-то из ресурсов, захваченных B, блокируется, выжидает свой deadlock_timeout, откатывается.

Хм... Судя по исходникам так и есть :(

ЗЫ: Одно радует, что хоть для MS SQL такой механизм по идее должен работать.
...
Рейтинг: 0 / 0
Deadlock priority
    #39284448
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

Хотя если к времени старта транзакции, добавлять время предыдущих попыток (с коэффициентом, например 0,5), через какое то время транзакции выйдут из хронического deadlock'а (когда время предыдущих попыток превысит предполагаемое время выполнения A и B).
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Deadlock priority
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]