java - 服务层和 Spring 事务中的验证

标签 java spring transactions

我曾经认为在分层应用程序( Controller 或服务)中放置验证逻辑的位置并不重要,但最近正在开发需要事务的服务(使用 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 首先打开事务,然后执行代码。考虑到验证可能会失败并且根本不需要数据库调用,这是否意味着将验证逻辑放入服务层会在数据库上创建额外的负载,例如应用程序会在没有任何原因的情况下打开/回滚事务吗? (回滚,因为验证通常会抛出一些验证异常)。

最佳答案

使用仅验证对象的 validator 层会很方便。没什么特别的。通常,当使用 spring @Transactionl 时,我首先通过验证层验证对象,然后传递到服务层。

如果您确实关心数据库打开关闭,您可以检查 @Transactional(propagation=Propagation.REQUIRED) 注释。你可以检查这个答案 @Transactional(propagation=Propagation.REQUIRED)

关于java - 服务层和 Spring 事务中的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56151779/

相关文章:

java - 如何在Spring集成DSL中为 channel 设置多个消息处理程序?

java - 线程 "main"com.google.api.client.auth.oauth2.TokenResponseException : 401 Unauthorized 中的异常

java - 从使用无限滚动的网页中解析 html

redis - Redis ZPOP的实现

java - @Transactional 和 @Transactional(readOnly=true) 有什么区别

java - 给定一个数字,返回从 1 开始到该数字不重复的数字的个数?

java - 如何将 ENUM 绑定(bind)到单选按钮?

java - spring WebClient 如何从使用 http/1.1 的 spring webflux 服务器接收流数据

java - 自注入(inject)原型(prototype)bean - 循环引用

mysql - 即使回滚后,插入原子事务中的数据仍然存在