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

时间:2013-12-19 14:25:55

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

Spring会在每次调用包之后发出对数据库的提交,还是只在完成所有操作后才提交?

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

我的问题是,只有在所有调用都来自控制器类并且控制器已经完成之后,Spring才会提交,或者它会在每次执行SpringStoredProcedure后提交吗?

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

1 个答案:

答案 0 :(得分:2)

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)上,您可以在存储过程中提交事务,这将保留现有事务中所做的所有更改,并且新事务将跟随。