我使用以下方法使用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);
}
}
但是每当异常发生时,交易都没有回滚,任何人都可以建议我在这里做错了什么。
答案 0 :(得分:3)
如果您从下面提到的同一个类中调用saveAndUpdatepMSTAndRollUpEntries
此方法,那么@Transactional
将无效。
EG:
Class Sample{
public void someMethod()
{
saveAndUpdatepMSTAndRollUpEntries(); // Wont rollback
}
private void saveAndUpdatepMSTAndRollUpEntries()
{
}
}
这是因为spring使用Transactional的代理对象而你没有使用代理对象调用事务方法,而是使用this
对象。
对于工作的东西,你可以打电话如下:
Class Sample{
public void someMethod()
{
Sample obj=ApplicationContextProvider.getApplicationContext().getBean(Sample.class);
obj.saveAndUpdatepMSTAndRollUpEntries(); // will rollback since you are calling using proxied spring bean.
}
private void saveAndUpdatepMSTAndRollUpEntries()
{
}
}
我想这就是问题 -