【发布时间】:2019-02-14 05:46:28
【问题描述】:
我正在尝试阅读有关 Transaction 的信息,但我不明白如何回滚异步方法调用,是否有可能这样做。
我面临一个问题,例如,用户可以选择手动或无人驾驶汽车。因此,如果他选择无人驾驶,则手动配置将被禁用,反之亦然。考虑一下,他正在从无人驾驶转向手动,无人驾驶配置被关闭,我调用另一个服务来关闭手动配置(这发生在异步调用中)。我添加了@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;
}
}
如果rest调用禁用手动配置时出现调用错误,则无人驾驶配置打开但手动配置未关闭,两者都打开。
问题:
将
@Transactional添加到调用者和被调用者方法有效吗? - 可以,但是会影响性能,这种情况下@Async是没有用的。调用方方法应该有
@Transactional,但@Async方法应该有@Transactional(REQUIRES_NEW)?在调用方方法@Transaction上回滚是否会在被调用方方法中回滚检查异常的事务?
我期待一个解决方案,在不影响性能的情况下实现数据的完整性(我希望 @Async 以现在的方式工作)
【问题讨论】:
标签: java spring asynchronous