Откат Spring Transaction после сбоя сети

Я работаю над довольно простым сервисом RESTful на основе SpringBoot. Я использую Ebean и SpringData. Все мои методы REST помечены @Transactional:

@Transactional
@PostMapping
public Entity createEntity(...) {
   // some code
}

Проблема, с которой я столкнулся, заключается в том, что если есть проблема с сетью, но этот метод выполняется без исключения, транзакция все равно будет зафиксирована. Например, клиент может отправить данные, мой код создает запись, но тогда сервер не может отправить ответ клиенту. В этом случае я бы хотел, чтобы транзакция откатилась, но я не нашел способа сделать это.

Можно ли в этом случае откатить транзакцию? Возможно, я упускаю из виду ограничение платформы Spring.

Спасибо

Обновлено: чтобы ответить на ответы ниже и указать вопрос дальше: достаточно легко откатить транзакцию. Сложная часть - запустить любой код в ответ на сбой сети. Я надеялся, что смогу настроить Spring, чтобы сделать это за меня. Например, «подождите, пока вы не отправите последний байт, а затем откатите или зафиксируйте транзакцию». Мой текущий код зафиксирует транзакцию, как только будет завершен метод createEntity ().

Как вы решили эту проблему?

humbleCoder 02.04.2020 11:33

@humbleCoder Я этого не сделал. Размышляя об этом сейчас, я думаю, что это даже не стоит решать. Всегда возможно, что даже если вы отправите данные, клиент может не прочитать их (т. Е. Произойдет сбой во время синтаксического анализа ответа). Итак, вам просто нужно смириться с тем фактом, что даже если ваша транзакция будет совершена, клиент может не знать.

Antonín Karásek 03.04.2020 13:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 089
3

Ответы 3

Если вы можете узнать, когда вам нужно откатиться (проверка статуса возврата / ...), вы можете просто выбросить свое собственное исключение.

Будьте внимательны, поскольку он выполняет откат только для неотмеченного исключения (в противном случае вам нужно добавить rollbackFor=Exception.class на ваш @Transactional, если вы хотите, чтобы он откатился для любого исключения).

Видеть :

https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

Аннотация @Transactional. Как откатиться?

Вы можете откатить транзакцию, не создавая исключения, используя:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

Это не ограничение Spring framework. После успешного выполнения метода @Transactional НЕ несет ответственности за его откат.

Лучшее, что вы могли сделать, - это иметь ExceptionHandler. См. Этот ответ для лучшего обзора: https://stackoverflow.com/a/45034574/945214

Еще вы могли бы улучшить производительность всей топологии HTTP-запроса, чтобы уменьшить вероятность такого потенциального сбоя (-ов) (по мере уменьшения времени касания). Смотрите мою рецензию на производительность приложения по адресу: https://www.linkedin.com/pulse/improving-website-performance-kshitiz-garg/

Другие вопросы по теме