Я запускаю приложение Play! и отлаживаю тупик.
Сообщения об ошибках, которые я вижу, записываются из Play!являются:
Deadlock found when trying to get lock; try restarting transaction
Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
Из Играть!Документация
Play будет автоматически управлять транзакциями для вас.Он начнет транзакцию для каждого HTTP-запроса и подтвердит его при отправке HTTP-ответа.Если ваш код вызывает исключение, транзакция автоматически откатывается.
Из документации MySQL
вы должны написать свои приложения так, чтобы они быливсегда готов перевыпустить транзакцию, если она откатывается из-за тупика.
Мой вопрос:
Как и где в моей игре!может ли приложение перехватить эти откатные транзакции и обработать их (выбрать переиздание, игнорировать их и т. д ...)?
Обновлено
Пока я в конечном итоге воспользовался советомв принятом ответе и поиске причины тупика (знаете ли вы, что ограничения внешнего ключа MySQL увеличивают вероятность взаимоблокировки? Теперь я знаю!), вот некоторый код, который работал для меня, чтобы отловить и заново выпустить неудачное сохранение.
boolean success = false;
int tries = 0;
while (!success && tries++ < 3) {
try {
updated.save();
success = true;
} catch (javax.persistence.PersistenceException e) {
pause(250);
}
}