#java #mysql #spring #spring-boot #transactions
Вопрос:
Я выполняю простую операцию по:
- Сначала удалите все записи. Если исключение откатится.
- Если исключений нет, вставьте все записи. Если исключение, ничего не удаляется, откат до 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. В вашем вопросе нет ничего о откате для.