【发布时间】:2016-03-04 03:12:03
【问题描述】:
一个@Transactional 方法调用另外两个方法,这两个方法也存在于@Transactional 方法中,但是当其中一个被调用方法出现异常时,事务应该回滚,它没有发生
-----The Main Transactional method-------------
@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = RestException.class)
public BaseDto createFPSAndUser(FpsStoreDto fpsStoreDto){
log.info("<--Starts FPSStoreService .createFPSAndUser-->"+fpsStoreDto);
BaseDto baseDto = new BaseDto();
try {
UserDetailDto userDetailDto = fpsStoreDto.getUserDetailDto();
userDetailDto.setCreatedBy(fpsStoreDto.getCreatedBy());
baseDto = createFPSStore(fpsStoreDto);
if(baseDto.getStatusCode() != 0){
throw new RestException(ErrorCodeDescription.getDescription(baseDto.getStatusCode()));
}
userDetailDto.setFpsStore(null);
baseDto = userDetailService.createUserDetail(userDetailDto);
if(baseDto.getStatusCode() != 0){
throw new RestException(ErrorCodeDescription.getDescription(baseDto.getStatusCode()));
}
FPSStore fpsStore = fpsStoreRepository.findByCode(fpsStoreDto.getCode());
UserDetail userDetail = userDetailRepository.findByUserId(userDetailDto.getUserId());
userDetail.setFpsStore(fpsStore);
userDetailRepository.save(userDetail);
baseDto.setStatusCode(0);
} catch(RestException restException){
log.info("RestException -:", restException);
restException.printStackTrace();
baseDto.setStatusCode(baseDto.getStatusCode());
} catch (Exception exception) {
log.info("Exception -:",exception);
exception.printStackTrace();
baseDto.setStatusCode(ErrorCodeDescription.ERROR_GENERIC.getErrorCode());
}
log.info("<--Ends FPSStoreService .createFPSAndUser-->"+baseDto);
return baseDto;
}
------------------Called method 1st-----------
@Transactional(propagation = Propagation.REQUIRED)
public BaseDto createFPSStore(FpsStoreDto fpsStoreDto) {
_________________________
__________________________
________________________
return baseDto;
}
------------------------2nd Transactional method-----
@Transactional(propagation = Propagation.REQUIRED)
public BaseDto createUserDetail(UserDetailDto userDetaildto) {
_______________
_______________
_______________
return baseDto
}
【问题讨论】:
-
这看起来像是您要求我们编写您的代码。 Stackoverflow 不是代码编写社区!另外请正确格式化您的代码!!!
-
容易出错的代码和复杂的事务配置。另外,删除 rollBackFor 东西。
-
嗨帕克哈罗。感谢您下次在病房中格式化代码的建议,我不会有机会问我这个问题。我问的不是代码的原因。请让我知道它为什么不起作用..因为我认为这个 stackoverflow 就是为了这个......
-
谢谢我们是博格..
-
这至少有 2 个问题,首先 spring 使用代理来应用 AOP,所以基本上内部方法调用上的
@Transactional被忽略,接下来你会捕获所有异常,因此会触发 tx 代码从来没有看到它并认为一切都很好并且会提交。
标签: java spring jpa transactions