@Transactional在春季启动时不回滚

时间:2018-04-17 06:32:17

标签: java spring exception-handling spring-transactions transactional

我使用以下方法使用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);
    }
 }

但是每当异常发生时,交易都没有回滚,任何人都可以建议我在这里做错了什么。

1 个答案:

答案 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()
{

}
}

我想这就是问题 -