Поиск цикла в графе делается под эксклюзивной блокировкой. Вероятность того, что оба участника дедлока решат сделать харакири достаточно мала.
Но есть другая более реальная проблема, которую мы действительно наблюдали.
И, вспомнив про неё, я склонен согласится, что в дедлок дететоре посгреса действительно есть деффект.
Под большой нагрузкой, если много транзакций конфликтуют за один и тот же ресурс (например table extension lock), то все они засыпают на этом локе и ... таймаут в них срабатывает примерно в одно и тоже время. И все они начинают искать дедлок, для этого пытая взять ксклюзивную блокировку. И... Всё практически встаёт.
Мы в ПгПро испытали несколько способов решить эту проблему:
1. Пытаться преварительно проверить наличие дедлка под шаред блокировкой.
2. Если кто-то уже ищет циклы в графе, то запретить ругим бэкендам заниматься дедлок детекшином
3. Запоминать в рётрах графа блокировки время последнего прохода и не ходить повторно по ним в течении какого-то времени
> Поиск цикла в графе делается под эксклюзивной блокировкой. Вероятность того, что оба участника дедлока решат сделать харакири достаточно мала.
Я думал, что если один из участников дедлока ищет, то после поиска он делает так, чтобы его больше в этом цикле в графе небыло. Тогда второй протсо не будет умирать, так как после unlock-а граф будет без цикла.
Ну да ладно.
То, что вы описали, не предотвращает livelock с 3 сессиями:
Вот пример:
ses 1|ses 2 |ses 3
--------------------------
t1| row 1| row 2| row 3
t2| row 2| row 3| row 1
t3| row 3| row 1| row 2
Первая сессия берёт последовательно блокировку на строки 1, 2, 3 в разные моменты времени, второая - на эти эти же строки, но в порядке 2, 3, 1 и т.д.
Если умирать будет не самый подходящий бэкенд, то после повтора будет livelock.