如何从服务 class 回滚事务?

How to rollback transaction from service class?

我正在尝试通过抛出异常来回滚某些情况。但我找不到合适的方法来做到这一点。这是我的服务 class

@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 class

@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 方法,然后如果条件为真,则撤消更新。 我的意图是当我抛出异常时,事务结束并且不提交更新。但我错了,更新已经完成了。请帮助我实现我的目标。

为了实现您想要的效果,您需要在 Service 方法中已有一个事务。 @Transactional(value = "transactionManager", rollbackFor = Exception.class) 的默认传播类型是 Propagation.REQUIRED,这意味着如果您的服务已包含在事务中,则 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).