Я не знаю какой-либо специальной поддержки инструмента ORM для автоматического повторного запуска транзакций, которые завершились неудачно из-за взаимных блокировок. Однако я не думаю, что ORM делает решение проблем блокировки / взаимоблокировки совсем другим. Во-первых, вы должны проанализировать первопричину ваших взаимоблокировок, а затем перепроектировать ваши транзакции и запросы таким образом, чтобы избежать или, по крайней мере, уменьшить их. Существует множество вариантов улучшения, таких как выбор правильного уровня изоляции (частей) ваших транзакций, использование подсказок блокировки и т. Д. Это зависит в большей степени от вашей системы баз данных, чем от ORM. Конечно, это помогает, если ваш ORM позволяет вам использовать хранимые процедуры для какой-то тонко настроенной команды и т. Д.
Если это не помогает полностью избежать взаимоблокировок, или у вас нет времени, чтобы внедрить и протестировать настоящее исправление сейчас, конечно, вы можете просто попробовать / поймать вокруг вашего сохранения / фиксации / сохранения или чего-то еще вызовите, проверьте перехваченные исключения, если они указывают, что сбойная транзакция является «жертвой тупика», а затем просто вызовите save / commit / persist после нескольких секунд ожидания. Хорошая идея - подождать несколько секунд, поскольку взаимные блокировки часто указывают на наличие временного пика транзакций, конкурирующих за одни и те же ресурсы, и повторное повторение одной и той же транзакции снова и снова, вероятно, ухудшит ситуацию.
По той же причине вы, вероятно, не захотите убедиться, что пытаетесь повторить ту же транзакцию только один раз.
В реальном сценарии мы когда-то внедрили этот вид обходного пути, и около 80% «жертв тупика» преуспели на втором этапе. Но я настоятельно рекомендую покопаться глубже, чтобы исправить фактическую причину взаимоблокировки, потому что эти проблемы обычно растут в геометрической прогрессии с количеством пользователей. Надеюсь, это поможет.