Я пытаюсь прочитать о транзакции, но не могу понять, как откатить асинхронный вызов метода, возможно ли это сделать.
Я столкнулся с проблемой, когда пользователь может выбрать либо выбрать вручную, либомашина без водителя например.Так что, если он выберет без водителя, то ручная конфигурация будет отключена и наоборот.Учтите, что он переходит из режима без драйверов в режим ручного управления, конфигурация без драйверов отключена, и я звоню в другую службу, чтобы отключить ручную настройку (которая происходит при асинхронном вызове).Я добавил @Async
по причине, поскольку это требует много времени.
пример
// Caller
@Override
public void enableDriverlessDriving(DriverlessDriving driverlessConfig) {
validator.validate(driverlessConfig);
driverlessDao.update(driverlessConfig);
if(drivelessConfig.isEnabled()) {
manualService.onDrivelessEnabled(driverlessConfig.getUserId());
}
}
// Callee
@Override
@Aysnc
public void onDrivelessEnabled(int userId) {
.....
// retrofit rest call. Timeout for 30 secs
ManualConfig config = client.getManualConfiguration(userid,30);
config.isEnabled(false);
try {
// retrofit rest call. timeout for 30 secs
client.updateManualConfig(config, userId,30);
}catch(CheckedExceptions e) { // throwing checked exceptions here.
LOGGER.error(...)
return;
}
}
Если при вызове покоя возникает ошибка вызова для отключения ручной настройки, конфигурация без драйвероввключен, но ручная настройка не выключена, оба включены.
Вопрос:
Добавление @Transactional
в метод вызова и вызываемого абонента работает?- Может быть, но тогда это повлияет на производительность, в этом случае не будет использоваться @Async
.
Если метод вызывающей стороны имеет @Transactional
, но @Async
метод должен иметь @Transactional(REQUIRES_NEW)
?Будет ли откат по методу вызывающего абонента @Transaction
откатить транзакцию для проверенного исключения в методе вызываемого абонента?
Я ожидаю решения, в котором я добиваюсь целостности данных без ущерба для производительности (яхочу @Async
работать так, как сейчас работает)