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