Недавно я работал с Spring boot + spring data jpa + hibernate. Я столкнулся с одной проблемой с весенними транзакциями. Вот мой класс обслуживания и два вопроса:Весенние транзакции с ловушками Исключения
@Transactional
@Service
class MyService {
@Autowired
private MyRepository myRep;
public void method_A() {
try {
method_C();
.....
method_B();
} catch(Exception e) {}
}
public void method_B() {
Entity e = new Entity();
e.set(...);
myRep.save(e);
}
public void method_C() throws Exception {
....
}
}
1.Если метод method_C()
генерирует исключение, и я хочу, чтобы поймать его и зарегистрировать ее, транзакция не rollbacked в методе method_B()
, поскольку исключение не доходит до весны фреймворк. Итак, как мне сделать, чтобы поймать Исключения из method_C()
и в то же время не потерять способность метода method_B()
откат?
2. Рассмотрите новый метод method_A()
.
public void method_A() {
for(...) {
...
...
method_B();
}
}
Я хочу, чтобы вызвать method_B()
в цикле. Если возникает исключение в method_B()
, я хочу, чтобы транзакция method_B()
была отклонена, но method_A()
не должен выйти, и цикл должен продолжаться. Как я могу это достичь?
Не перехватывайте исключения, пружина будет регистрировать исключение в любом случае, включая полную трассировку стека, поэтому зачем беспокоиться об этом самостоятельно. Для варианта 2 просто установите try/catch внутри цикла for. Метод B по-прежнему действует как есть (включая откат), и метод все еще продолжается. Если вам нужна дополнительная обработка исключений, вы всегда можете написать аспект после броска, чтобы выполнить регистрацию, или добавить улов, но всегда восстанавливать исключение (но из-за уже зарегистрированного Spring, который был бы избыточным). –
Если я добавлю блок try-catch в цикле, транзакция не будет отменена в 'method_B ()'. Объект сохраняется и заносится в базу данных. – polis
Предполагалось, что метод A не был в транзакции, только метод B. –