#spring #spring-boot #rest
Вопрос:
Пожалуйста, обратитесь к приведенному ниже фрагменту кода
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class }) @Override public MyClass myMethod(myParams) { try{ myRepo.saveAll(myEntityList); ResponseEntitylt;Stringgt; responseEntity = restTemplate.postForEntity(myUrl,requestParam,String.class); if(responseEnity.getBody()!=null amp;amp; StringUtils.equalsIgnoreCase(responseEnity.getBody(),"Failure")){ log.error("Rest Call Failed"); throw new RestClientException("Error in remote service"); } }catch(Exception e){ e.printStackTrace(); } }
Теперь в журнале консоли я вижу RestClientException
, что он выбрасывается, но myRepo.saveAll(myEntityList);
не откатывается, вместо этого он вставляет данные в БД.
Кто-нибудь может разобраться в этой проблеме?
Мое требование состоит в том, что RestServiceCall
если я получу ответ на сбой, то моя текущая транзакция должна полностью откатиться.
Комментарии:
1. Как
myMethod()
вызывается метод и какой класс это делает?2. Он не будет откатываться , исключение перехватывается
3. myMethod() вызывается со уровня контроллера, и этот метод находится на уровне сервиса. В слое dao/уровне репо у меня нет отдельной транзакции. Все транзакции поддерживаются только на уровне обслуживания
4. @ meobeo173 я понимаю, что изнутри блока try, если произойдет какое-либо исключение, spring должен откатить все операции dml, выполняемые в этом блоке try.
5. @meobeo173 прав, вам нужно либо удалить try-catch, либо поймать исключение, зарегистрировать что-то и повторно создать другое исключение.
Ответ №1:
Ваша транзакция не откатывается, потому что не возникает исключения, вы его ловите.
Как упоминал @Sumit Ghost, вы можете зарегистрировать его и повторно создать исключение