【发布时间】:2018-09-27 00:29:41
【问题描述】:
我正在使用以下方法使用 Spring Boot 应用程序:
@Transactional(rollbackOn = Exception.class)
private void saveAndUpdatepMSTAndRollUpEntries(pMST newpMSTEntry,
pMST existingpMSTEntry,
List<sPTrans> sPTranss,
List<sPTrans> sPTransUpdatedFlagList) {
if(!ObjectUtils.isEmpty(existingpMSTEntry))
databaseService.deleteProcessedpMST(existingpMSTEntry);
if(!CollectionUtils.isEmpty(sPTransUpdatedFlagList))
databaseService.saveProcessedsPTransFeedWithUpdatedFlag(sPTransUpdatedFlagList);
if(!ObjectUtils.isEmpty(newpMSTEntry))
databaseService.saveProcessedpMSTTableEntry(newpMSTEntry);
}
而我的数据库服务包含的代码如下:
public class DatabaseService {
private PosMonthlyStRepository posMonthlyStRepository;
private ScmsaPosTransRollupRepository scmsaPosTransRollupRepository;
public DatabaseService(PosMonthlyStRepository posMonthlyStRepository) {
this.posMonthlyStRepository = posMonthlyStRepository;
}
public void deleteProcessedpMST(pMST objpMST){
posMonthlyStRepository.delete(objpMST);
}
public void saveProcessedsPTransFeedWithUpdatedFlag(List<sPTrans> sPTransssPTransUpdatedFlagList) {
scmsaPosTransRollupRepository.save(sPTransUpdatedFlagList);
}
public void saveProcessedpMSTTableEntry((pMST objpMST) {
posMonthlyStRepository.save(objpMST);
}
}
但是每当发生异常时,事务都不会回滚,谁能告诉我这里做错了什么。
【问题讨论】:
-
从方法是
private这个事实来看,你在内部调用这个方法。由于 Spring 使用代理来实现 AOP(是的,它用于事务),因此调用不会通过代理,基本上@Transactional不会做任何事情。 -
您能否建议我还能做些什么。但是我所有的 databaseService 类方法都是公开的。
-
不,这不是很明显
private...您的工作单元(可能是最外层的方法)必须是@Transactional才能有一个工作单元成功或失败。 -
为什么要指定
rollbackOn = Exception.class?您的方法不会抛出任何已检查的异常。
标签: java spring exception-handling spring-transactions transactional