У меня есть код в этом формате (java + spring):
@Service
public class mainService{
@Inject
private ServiceA a;
@Inject
private ServiceB b;
@Transactional
public void methodTest{
try{
System.out.println("Start");
a.insertIntoDbTableOne();
b.insertIntoDbTableTwo();
}catch(Throwable e){
e.printStackTrace();
System.out.println("This is the catch statement");
}finally{
System.out.println("this is finally");
}
}
}
В моем классе действий я вызываю mainService.java
, внедряя его также в качестве службы.
Оба метода ServiceA
и ServiceB
также помечены @Transactional
.
Странно то, что когда я запускаю этот код (я делаю это, чтобы выдавать ошибку в ServiceA
метод, когда он вставляется в БД), последовательность результатов не то, что я ожидаю.
Результат:
1. "Start" is printed
2 Do stuff in insertIntoDbTableOne method (without inserting into db)
3. Do stuff in insertIntoDbTableTwo method (without inserting into db)
4. "this is finally" is printed
5. The system tries to insert the record the db which should be inserted in step 2 and hit error!
Я думаю, что это вызвано аннотацией транзакции, но япопытался удалить аннотацию транзакции в методе insertIntoDbTableOne
, но это не помогло.
Есть идеи, как заставить систему перехватить эту ошибку при попытке перехвата?я не могу позволить себе поймать его только в классе действий, который называет это methodTest
.