Приложение получило ошибку
40P01? Это PostgreSQL обнаружил цикл ожидания блокировок, а не доказательство взаимной блокировки Java-потоков.Достаточно двух строк: транзакция A обновила первую и ждёт вторую, B — наоборот. Такие дедлоки возможны даже без явного
LOCK TABLE, потому что обновление строки тоже берёт блокировку.PostgreSQL прервёт одну транзакцию, чтобы остальные продолжили работу. Какая станет жертвой, заранее полагаться нельзя. В локальной проверке двух сессий получен именно
deadlock detected с SQLSTATE 40P01.Базовый способ избежать цикла — брать блокировки в согласованном порядке во всех путях приложения. Если всё же повторяете запрос после дедлока, повторять нужно транзакцию целиком, а не только последнюю упавшую команду.
Дедлоки и порядок блокировок
#spring #java
