У меня есть объект GeneralKnowledgeTest, и он содержит множество полей статистики (ratingsCount, responsesCount, ratingStars...), которые обновляются каждый раз, когда пользователь проходит этот тест (takeTest() -> транзакционный метод).
Может случиться так, что многие пользователи одновременно проходят один и тот же тест, поэтому я подумал о реализации оптимистической блокировки (@version) и перехватчика, который повторяет метод takeTest в случае возникновения исключения оптимистической блокировки.
Итак, внутри метода takeTest я всегда получаю новый экземпляр GeneralKnowledgeTest, например. entityManager.find(testId), а затем обновите его поля статистики. В случае возникновения оптимистичного исключения перехватчик просто повторяет попытку метода takeTest до тех пор, пока он не завершится успешно.
Ваше мнение об этой процедуре. Является ли это хорошим способом реализовать оптимистическую блокировку для систем, в которых может быть много пользователей, пытающихся пройти один и тот же тест?
PS. Бизнес не допустит отображения каких-либо предупреждающих сообщений в случае возникновения исключения оптимистической блокировки, поэтому перехватчик необходим для обеспечения плавного выполнения...