【问题标题】:How to rollback transaction from service class?如何从服务类回滚事务?
【发布时间】:2021-12-13 10:39:43
【问题描述】:

我试图通过抛出异常来回滚某些条件。但我找不到正确的方法来做到这一点。这是我的服务类

@Service
public class UserManager implements IUserManager {

    private final IBasicEM basicEM;

    public ApplicantInfoManager(IBasicEM basicEM) {
        this.basicEM = basicEM;
    }

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public boolean purgeUser(Long id) throws Exception {
      //business logic
      basicEM.Update(entity)
      if(//condition) {
          throw New RollBackException("//message")
      }
      //business logic
    }
}

这是我的BasicEM 课程

@Component
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public class BasicEM {
    @PersistenceContext(unitName = "db1")
    private EntityManager em;

    public void update(Object target) {
        em.merge(target);
    }
}

所以我想要调用 update 方法,然后如果条件为真,则撤消更新。 我的意图是当我抛出异常时,事务结束并且不提交更新。但我错了,更新已经完成。请帮助我实现我的目标。

【问题讨论】:

    标签: spring hibernate orm transactions entitymanager


    【解决方案1】:

    为了实现你想要的,你需要在 Service 方法中已经有一个事务。 @Transactional(value = "transactionManager", rollbackFor = Exception.class) 的默认传播类型为 Propagation.REQUIRED,这意味着如果您的 Service 已包含在事务中,则 basicEM.Update(entity) 也将包含在此类事务中。

    @Service
    public class UserManager implements IUserManager {
    
        private final IBasicEM basicEM;
    
        public ApplicantInfoManager(IBasicEM basicEM) {
            this.basicEM = basicEM;
        }
    
        @Override
        @Transactional(value = "transactionManager", 
           propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
        public boolean purgeUser(Long id) throws Exception {
          //business logic
          basicEM.Update(entity)
          if(//condition) {
              throw New RollBackException("//message")
          }
          //business logic
        }
    }
    

    如果RollBackExceptionRuntimeException,则无需显式配置事务在抛出时应回滚。如果不是,则需要配置如下:@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)

    【讨论】:

    • 我的服务类中没有任何 @Transactional 或任何其他注释。只是@Service。我应该添加任何注释吗?
    • 是的,你需要它。您甚至可以将其应用于单个方法,而不是将其应用于完整的 Service 类。
    • 能否提供代码?
    • 请将服务代码添加到您的问题中,以便我可以为代码提供所需的更改。
    • 请检查我的更新代码
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2015-12-08
    • 2020-10-29
    • 2010-10-04
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多