我曾经认为在层级应用程序(控制器或服务)中放置验证逻辑并不重要,但是最近正在开发需要事务的服务(使用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调用,这意味着将验证逻辑放入服务层将对数据库产生额外的负载,例如应用程序会无故打开/回滚交易吗? (回滚,因为验证通常会引发一些验证异常)。
答案 0 :(得分:0)
使用仅用于验证对象的验证器层非常方便。通常,当使用spring @Transactionl时,我首先通过验证层验证对象,然后传递到服务层。
如果您真的很关心db open close,则可以检查@Transactional(propagation = Propagation.REQUIRED)批注。您可以检查这个答案 @Transactional(propagation=Propagation.REQUIRED)