Итак, я недавно обнаружил существование тупиков .Несмотря на то, что у меня его никогда не было, я понимаю, что это может быть проблемой за пределами среды тестирования, когда множество пользователей получают доступ одновременно.
Я выучил несколько советов, как это сделать меньше , но неникогда, поэтому я обеспокоен правильной обработкой этого.Итак, допустим, что мы обращаемся к базе данных через JDBC.
Я не нашел никаких ссылок на обработку взаимоблокировок ни в документации , ни в официальных примерах какони просто откатываются (или выводят и исключение, если это невозможно):
} catch (SQLException e ) {
JDBCTutorialUtilities.printSQLException(e);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
} catch(SQLException excep) {
JDBCTutorialUtilities.printSQLException(excep);
}
}
}
Как я понял, читая документацию, если метод executeUpdate()
находит тупик, он не повторяет попытку
Поиск различных решений Я нашел этот подход , который оборачивает все это в цикл со счетчиком и сном между каждой попыткой .
Итак, мои вопросы здесь таковы:
- Обрабатывает ли JDBC каким-либо образом взаимоблокировки, кроме генерации исключения?Любая библиотека на любом языке (по крайней мере, по желанию) повторяет запрос?
- Как бы вы справились с этим в сценарии, чувствительном к тупикам, с реализацией JDBC?
- Вы предотвращаете это в своем пользовательскомметоды доступа к базе данных?Кроме того, они у вас есть или вы просто используете строки по умолчанию при каждом доступе к базе данных?
- Почему ядро базы данных не перезапускает запрос жертвы, когда необходимые строки разблокируются?
РЕДАКТИРОВАТЬ: Я нашел это в Документация MySQL :
Всегда будьте готовы повторно выполнить транзакцию, если она завершится неудачно из-за тупика.Тупики не опасны.Просто попробуйте еще раз.
Что предлагает обрабатывать код приложения.
Есть мысли?Заранее спасибо.