Исключение RestClientException не отменяет всю транзакцию

#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, вы можете зарегистрировать его и повторно создать исключение