172 похожих чатов

Как Постгрес разрешает дедлоки? Какие настройки для разрешения дедлоков существуют?

Поделитесь ссылкой на доку.

22 ответов

17 просмотров

Путём проверки на deadlocks каждым процессом, если он ждёт lock более deadlock_timeout, и (почти всегда, кроме случая, когда один из участников — autovacuum, тогда "застрелят" его) "самоубийства" процесса, если он обнаруживает deadlock. Обратите внимание, что никаких приоритетов и т.п. нет (т.е. реализация "теоретически" дефектна — случай PostgreSQL выделен на слайде) , поэтому в принципе можно попасть в ситуацию starvation (к счастью, на практике это бывает крайне редко, например: https://murcode.ru/forum/7-postgresql/1224988-deadlock-priority/ ).

Yaroslav Schekin
Путём проверки на deadlocks каждым процессом, если...

Т.е. оба в откат, или первый коммит, второй назад? Выбрать стратегию можно?

V
Т.е. оба в откат, или первый коммит, второй назад?...

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

Владимир-Наумов Автор вопроса

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

Владимир Наумов
я так понял ,кто первый попался, того и прибивают....

Однако! Это ещё хуже, мне кажется. Откат обеих более правильный вариант, имхо, тк приоритеты равные у сессий.

Владимир Наумов
я так понял ,кто первый попался, того и прибивают....

Кто первый проверил на deadlock, тот и сам "умрёт". Т.е. для этого нет отдельного процесса deadlock detector, каждый backend проверяет сам, если попадает в эту ситуацию (когда ему пришлось ждать получения блокировки на протяжении deadlock_timeout). Потому, в т.ч. "the check for deadlock is relatively expensive", и проверки такие редкие: "The default is one second (1s), which is probably about the smallest value you would want in practice."

V
Однако! Это ещё хуже, мне кажется. Откат обеих бол...

Зачем откатывать обе сессии?! Во-первых, такое поведение "убивает" ту транзакцию, у которой были все шансы завершиться. Во-вторых, оно практически гарантирует starvation (потому что при повторении тех же транзакций та же ситуация с большой вероятностью повторится снова... и снова).

Yaroslav Schekin
Зачем откатывать обе сессии?! Во-первых, такое по...

потому что завершение этой транзакции приведет к нежелательному виду "конкурентного ресурса" у убитой транзакции. в общем это холивар, примем как данность, что вторая умирает и всё тут.

> приведет к нежелательному виду "конкурентного ресурса" у убитой транзакции Что Вы имели в виду? У убитой транзакции никаких ресурсов уже нет (потому что её не существует), если что. > в общем это холивар Это не "холивар", а классическая теория (родом из 1980-х, а то и раньше), "принимать как данность" там ничего не нужно — там всё давно разработано и доказано (знай себе аккуратно сдирай реализацию с учебников). > вторая умирает и всё тут. И это, как раз, "содрано" с "классики". ;)

Yaroslav Schekin
> приведет к нежелательному виду "конкурентного ре...

пример: сидят две тёти и правят справочник - 1я хотела поменять название на А, 2я на Б. В итоге будет А. 2й убитой хотелось Б, но ей не дали (она обиделась). Если бы все было однозначно, то стратегии не выдумали. Такое поведение не всегда нужно, иногда надо отменять обе, тк возникла спорная ситуация. Вообще конечно нужно просто лочить селекты c for update и отстреливать на эксепшене, чтобы не давать таким ситуациям возникать.

V
пример: сидят две тёти и правят справочник - 1я хо...

> 2й убитой хотелось Б, но ей не дали (она обиделась). Она повторит, как обычно (и далее будет так, как предусмотрел программист). > Если бы все было однозначно, то стратегии не выдумали. "Стратегии" выдумали для того, чтобы не попадать в ситуации, когда "эта музыка будет вечной", понимаете (опять-таки, см. слайд и пример того, как это бывает в жизни (по ссылке))? > иногда надо отменять обе, тк возникла спорная ситуация. Не надо. И вообще... а Вы можете показать хоть одну СУБД, которая отменяет обе транзакции при deadlock?

Владимир-Наумов Автор вопроса

А зачем откатывать обе, не пойму? зачем тратить ресурс на откат обеих транзакций, когда можно оду все-таки нормально зафиксировать?

Владимир Наумов
А зачем откатывать обе, не пойму? зачем тратить ре...

Откуда я знаю? Это надо у @amino256 спросить. Что я знаю, так это то, что в теории concurrency control такого варианта ("стратегии") не существует, и ни одной СУБД, которая ведёт себя подобным образом, я лично не знаю.

Владимир-Наумов Автор вопроса
Yaroslav Schekin
Откуда я знаю? Это надо у @amino256 спросить. Что ...

да, действительно из коробки такого варианта нет, но в приложении так делали через перехват ошибки, была необходимость в убийстве обеих

Владимир-Наумов Автор вопроса
V
да, действительно из коробки такого варианта нет, ...

закрываем период в той же 1С, транзакция около часа... на 59 минуте возникла взаимоблокировка с короткой транзакцией, откатываем обе, и теряем 2 часа времени? Смысл?

V
да, действительно из коробки такого варианта нет, ...

Ну это да, "допрограммироваться" можно до совсем уж странных "необходимостей" (например, нам вот как-то пришлось преднамеренно провоцировать (!) deadlocks c целью получения корректных данных (т.е. либо транзакция сразу попадает в deadlock→откатывается→повторяется, либо получает нужные данные), а всё оттого, что кто-то там ранее "допрограммировался" с управлением транзакциями "вручную" — и другого варианта мы не нашли).

Владимир Наумов
закрываем период в той же 1С, транзакция около час...

на длинных в DWH спору нет, такие кейсы в OLTP больше, когда спор на милисекунды и потеря обеих особо не портит ничего, ждать нельзя, и нужно целостность сохранить

V
пример: сидят две тёти и правят справочник - 1я хо...

перефразируя один фильм: "откат обоих транзакций — это как любовь в резинке: движенье есть, прогресса нет".

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта