Я работаю с базой данных DB2 и протестировал следующий код: независимо от того, имеет ли methodB значение Propagation.REQUIRES_NEW или нет, если для methodB есть исключение, результат methodA будет корректно зафиксирован независимо.
Это противоречит моему предположению что Propagation.REQUIRES_NEW должен использоваться для достижения этой цели.
ClassA
@Autowire
private ClassB classB;
@Transactional
methodA(){
...
try{
classB.methodB();
}catch(RuntimeException ex){
handleException(ex);
}
...
}
ClassB
@Transactional(propagation = Propagation.REQUIRES_NEW)
methodB(){...}
Спасибо за @Kayaman Я думаю, я понял это сейчас.
Поведение, которое я видел, связано с @Transactional метода methodB аннотация не работала, поэтому methodB обрабатывается как обычная функция без любой аннотации транзакции.
В чем проблема, так это то, что в methodA я вызывал methodB из подкласса ClassB с помощью super.methodB()
и подумал, что он даст транзакционный метод B, который не работает:
@Service
@Primary
ClassC extends ClassB{
@override
methodB(){
super.methodB();
}
}
Я знаю, что аннотация транзакции не будет работать, если вы вызываете метод транзакции из другого нетранзакционного метода того же учебный класс.
Не знал, что super.methodB()
также потерпит неудачу по той же причине (кто-нибудь может дать немного больше объяснений, пожалуйста?)
В заключение, на примере первого блок кода, когда methodB имеет RuntimeException,
Если methodB имеет NO transaction
аннотацию: A & B совместно используют одну и ту же транзакцию; methodA НЕ откатит
, если methodB имеет аннотацию REQUIRED
: A & B совместно используют одну и ту же транзакцию; methodA выполнит откат
, если methodB имеет аннотацию REQUIRES_NEW
: A & B имеют отдельные транзакции; methodA НЕ ОТКАДЕТ