Вы правы. По умолчанию @Transactional
будет выполнять откат только для RuntimeException
и Error
, но не для проверенного исключения. Это означает, что если вы также хотите откатить проверенное исключение, вы должны перехватить все отмеченные исключения и повторно выдать их как RuntimeException
или просто использовать настройку rollbackFor
в @Transactional
.
* 1009. * Я не уверен, что исключения, сгенерированные при сбое пакета, отмечены или не отмечены.
Компилятор java поможет проверить это. Если некоторые из внутренних методов выдают проверенное исключение, это требует вы должны обработать его, который вы не можете ни перехватить, ни указать, чтобы выбросить это проверенное исключение в объявлении метода. Коды не могут быть скомпилированы, если вы этого не сделаете.
Это означает, что если ваши коды могут компилироваться, из внутренних методов не выдается проверенное исключение, и вы можете просто придерживаться текущих настроек. С другой стороны, если какое-то проверенное исключение выдается из внутренних методов, вы можете выбрать перехват и повторный выброс как RuntimeException
:
@Transactional
public void doSomeStuff() {
try{
}catch(Exception ex){
throw new RuntimeException("something goes wrong.." ,ex);
}
}
или настроить rollbackFor
@Transactional(rollbackFor={Exception.class})
public void doSomeStuff() throws Exception{
}
Также обратите внимание, что session.flush()
- это не то же самое, что совершить транзакцию, поэтому ваши коды не будут фиксироваться для каждой партии. Вместо этого транзакция будет зафиксирована после успешного завершения метода, помеченного как @Transactional, который в вашем случае будет возвращен doSomeStuff()
при вставке всех записей.
Точка flush()
предназначена для последующих session.clear()
которые очищают память от сеанса так, что это не приведет к исчерпанию памяти JVM, если вы вставите много записей.