Класичний приклад: переказ грошей. Транзакція A блокує рахунок 1, потім намагається заблокувати рахунок 2. Транзакція B заблокувала рахунок 2 і чекає рахунок 1. Обидві чекають вічно.
MySQL та інші СУБД автоматично виявляють дедлок і «вбивають» одну з транзакцій (з меншим обсягом змін). Ця транзакція завершується помилкою і повинна бути перезапущена додатком.
SELECT ... FOR UPDATE лише де справді потрібно