java - Spring MVC 在调用 SpringStoredProcedure.execute() 后是否发出提交

标签 java spring spring-mvc model-view-controller struts

Spring 在每次包调用后都会向数据库发出提交,还是仅在所有操作完成后才提交?

我正在使用 Spring 和 Struts。在我的 Controller 类中,我在 DAO 类中使用 spring 存储过程调用许多数据库包。每个调用在 DAO 类中都有其唯一的方法

我的问题是,Spring 仅在 Controller 类进行所有调用且 Controller 完成后才提交,还是在每次执行 SpringStoredProcedure 后提交?

my_package_getusers = SpringStoredProcedure.getStoredProcedureCompiled(getJdbcTemplate()
....
my_package_getusers.execute(params).get("result")

最佳答案

来自 spring-jdbc 的 Spring 实用程序类不进行任何提交。提交事务的责任属于spring-tx(事务支持。

这通常是通过在应该在事务范围内运行的方法上放置@Transactional注释来实现的。所以如果你有方法

@Transactional
public void doSomething(SomeClass arg) {...}

输入该方法将创建新事务,如果事务上下文不存在,则该事务将在离开事务后提交。但是,如果从使用 @Transactional 注解的其他方法调用该方法,则将使用父事务上下文。

作为替代方案,您可以使用org.springframework.transaction.support.TransactionTemplate来获得对事务的更多控制(例如,从事务上下文启动单独的事务)。

示例:

    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
         // do something in trancation)
        }
    });

请注意,在某些数据库(例如 Oracle)上,您可以在存储过程中提交事务,这将保留现有事务中所做的所有更改,并且新事务将跟随。

关于java - Spring MVC 在调用 SpringStoredProcedure.execute() 后是否发出提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684201/

相关文章:

java - 如何在 Aerospike Spring Data 中使用 CAS 感知策略保存文档

java - spring bean实现接口(interface)的bean ID是多少

java - 在构建 SpringMVC 上保护上传的文件

java - 在 Eclipse Luna 中如何跳过除一个断点之外的所有断点?

java - 实体必须被管理才能调用删除?

java - SpringMvc - javax.validation.ValidationException

java - 在 URL 调用时执行 spring-application 内的 main-method

mysql - SpringMvc + Cloud SQL (MySQL) 集成

数值算法中的 Java 性能

spring - 热插拔不适用于使用 Intellij 和 spring-boot-starter-web 的 Spring 引导