Я работаю над довольно простым сервисом RESTful на основе SpringBoot. Я использую Ebean и SpringData. Все мои методы REST помечены @Transactional:
@Transactional
@PostMapping
public Entity createEntity(...) {
// some code
}
Проблема, с которой я столкнулся, заключается в том, что если есть проблема с сетью, но этот метод выполняется без исключения, транзакция все равно будет зафиксирована. Например, клиент может отправить данные, мой код создает запись, но тогда сервер не может отправить ответ клиенту. В этом случае я бы хотел, чтобы транзакция откатилась, но я не нашел способа сделать это.
Можно ли в этом случае откатить транзакцию? Возможно, я упускаю из виду ограничение платформы Spring.
Спасибо
Обновлено: чтобы ответить на ответы ниже и указать вопрос дальше: достаточно легко откатить транзакцию. Сложная часть - запустить любой код в ответ на сбой сети. Я надеялся, что смогу настроить Spring, чтобы сделать это за меня. Например, «подождите, пока вы не отправите последний байт, а затем откатите или зафиксируйте транзакцию». Мой текущий код зафиксирует транзакцию, как только будет завершен метод createEntity ().
@humbleCoder Я этого не сделал. Размышляя об этом сейчас, я думаю, что это даже не стоит решать. Всегда возможно, что даже если вы отправите данные, клиент может не прочитать их (т. Е. Произойдет сбой во время синтаксического анализа ответа). Итак, вам просто нужно смириться с тем фактом, что даже если ваша транзакция будет совершена, клиент может не знать.




Если вы можете узнать, когда вам нужно откатиться (проверка статуса возврата / ...), вы можете просто выбросить свое собственное исключение.
Будьте внимательны, поскольку он выполняет откат только для неотмеченного исключения (в противном случае вам нужно добавить rollbackFor=Exception.class на ваш @Transactional, если вы хотите, чтобы он откатился для любого исключения).
Видеть :
https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/
Вы можете откатить транзакцию, не создавая исключения, используя:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
Это не ограничение Spring framework. После успешного выполнения метода @Transactional НЕ несет ответственности за его откат.
Лучшее, что вы могли сделать, - это иметь ExceptionHandler. См. Этот ответ для лучшего обзора: https://stackoverflow.com/a/45034574/945214
Еще вы могли бы улучшить производительность всей топологии HTTP-запроса, чтобы уменьшить вероятность такого потенциального сбоя (-ов) (по мере уменьшения времени касания). Смотрите мою рецензию на производительность приложения по адресу: https://www.linkedin.com/pulse/improving-website-performance-kshitiz-garg/
Как вы решили эту проблему?