【问题标题】:@Transactional is not rollback in spring boot@Transactional 在 Spring Boot 中不回滚
【发布时间】: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


【解决方案1】:

如果您从下面提到的同一类中调用 saveAndUpdatepMSTAndRollUpEntries 这个方法,那么 @Transactional 将不起作用。

EG:
Class Sample{

public void someMethod()
{
saveAndUpdatepMSTAndRollUpEntries(); // Wont rollback
}
private void  saveAndUpdatepMSTAndRollUpEntries()
{

}
}

这是因为 spring 为 Transactional 使用代理对象,而您没有使用代理对象调用 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()
{

}
}

我猜这是问题-

添加了applicationContextprovider

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

  private ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }

  public ApplicationContext getContext() {
    return applicationContext;
  }
}

【讨论】:

  • @kaviya.P 然后可能是其他一些问题。发布您的整个代码,我的意思是调用者方法。可能您必须使用propagation.nested 进行事务处理
  • 我已经添加了。请您检查一下并帮助我摆脱它
  • ApplicationContextProvider 哪个包 STS/eclipse 没有显示任何建议
  • 谢谢,伙计。我到处寻找。应用程序上下文提供程序已解决。有关于这些领域的博客或文档吗?
猜你喜欢
  • 2018-11-08
  • 2021-08-28
  • 2017-04-14
  • 2019-06-15
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多