Откат весенней транзакции после сбоя сети - PullRequest
0 голосов
/ 04 июня 2018

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

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

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

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

Спасибо

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

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

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

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
0 голосов
/ 04 июня 2018

Это не ограничение среды Spring.Как только метод выполнен успешно, НЕ является обязанностью @Transactional фреймворка Spring для его отката.

Лучшее, что вы можете сделать, - это иметь ExceptionHandler.Посмотрите этот ответ для лучшей перспективы: https://stackoverflow.com/a/45034574/945214

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

0 голосов
/ 04 июня 2018

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

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

См .:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...