Два обновления должны быть включены в транзакцию.
@Transaction
- это в двух словах.
Ваша служба должна быть структурирована следующим образом.
@Transactional
public void validateFieldAndPushToStore(A a, B b) {
serviceA.validateAndPushA(a);
serviceB.validateAndPushB(b);
}
Где реализации для serviceA и serviceB будут.
@Transactional
public void validateAndPushA(A a){
validate(a); // can throw validation exception from here
persist(a); // can throw persistence exception from here
}
@Transactional
public void validateAndPushB(B b){
validate(b); // can throw validation exception from here
persist(b); // can throw persistence exception from here
}
Обратите внимание на @Transactional
поверх validateAndPushA
и validateAndPushB
.Методы persist
также должны быть аннотированы @Transactional
.
Если вы структурируете свой код таким образом, если произойдет какое-либо исключение из проверки или постоянства, все изменения в базе данных будут отменены .Это происходит потому, что @Transactional
имеет свойство с именем propagationLevel
, которое, если оставить значение по умолчанию, выполнит любую внутреннюю транзакцию (например, операции persist
) в одной внешней транзакции (т. Е. validateAndPushA
, * 1025).*, validate
и persist
будут выполняться в одной и той же транзакции, поэтому любое исключение, вызванное этими методами, приведет к откату всей транзакции.
@Transactional
допускает большую тонкую настройкуНапример, для каких исключений транзакция не должна откатываться.Пожалуйста, обратитесь к документации для всех деталей.
Надеюсь, это поможет!