Транзакция — Происходит неожиданный откат — не в состоянии понять

#java #mysql #spring #spring-boot #transactions

Вопрос:

Я выполняю простую операцию по:

  1. Сначала удалите все записи. Если исключение откатится.
  2. Если исключений нет, вставьте все записи. Если исключение, ничего не удаляется, откат до 1.
    Для этого у меня есть одна конечная точка API, которая вызывает пример функции.
    В примере функции у меня есть логика.
    В Репозитории я использую два запроса.
    Кроме того, исключение печатается.

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

Конечная точка API:

 functionAPI(){
    exampleFunction(...);
} 
 
 @Transactional
exampleFunction(...){
  try {
    repo.deleteall(...);
    repo.insertall(...);
  } catch {
    System.out.println("exception");
  }
}
 

Репо:

 @Modifying
@Transactional
@Query(...)
deleteall(...)

@Modifying
@Transactional
@Query(...)
insertall(...)
 

Комментарии:

1. Есть исключение, которое вы улавливаете и тем самым портите транзакцию. Не ловите исключение. Также, если exampleFunction он находится в том же классе, functionAPI что и метод @Transactional , этот метод ничего не делает. Наконец, ваши методы должны быть public @Transactional эффективными.

2. Привет. Да, все методы являются общедоступными. exampleFunction находится в другом классе, чем functionAPI. Что касается части улова, я хочу уловить в примере функцию и установить причину, по которой происходит откат, вот почему я ловлю.

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

4. Привет. Я попробовал то, что ты сказал. Я выбросил исключение и поймал его в functionAPI. Но мой вопрос, если я использую откат, является ли это правильным подходом?

5. В вашем вопросе нет ничего о откате для.