在服务层和Spring事务中进行验证

时间:2019-05-15 14:28:44

标签: java spring transactions

我曾经认为在层级应用程序(控制器或服务)中放置验证逻辑并不重要,但是最近正在开发需要事务的服务(使用spring @Transactional)。 Spring使用方面创建代理,这是Spring代码的样子:

org.springframework.transaction.interceptor.TransactionAspectSupport

if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
    // Standard transaction demarcation with getTransaction and commit/rollback calls.
    TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
    Object retVal = null;
    try {
        // This is an around advice: Invoke the next interceptor in the chain.
        // This will normally result in a target object being invoked.
        retVal = invocation.proceedWithInvocation();
    }
    catch (Throwable ex) {
        // target invocation exception
        completeTransactionAfterThrowing(txInfo, ex);
        throw ex;
    }
    finally {
        cleanupTransactionInfo(txInfo);
    }
    commitTransactionAfterReturning(txInfo);
    return retVal;
}

所以从我这里看到的情况来看,spring首先打开了事务,然后执行了代码。考虑到验证可能会失败并且根本不需要进行DB调用,这意味着将验证逻辑放入服务层将对数据库产生额外的负载,例如应用程序会无故打开/回滚交易吗? (回滚,因为验证通常会引发一些验证异常)。

1 个答案:

答案 0 :(得分:0)

使用仅用于验证对象的验证器层非常方便。通常,当使用spring @Transactionl时,我首先通过验证层验证对象,然后传递到服务层。

如果您真的很关心db open close,则可以检查@Transactional(propagation = Propagation.REQUIRED)批注。您可以检查这个答案 @Transactional(propagation=Propagation.REQUIRED)