0

我想在一个方法中,在方法未结算前,提交我更新的数据到数据库。这个如何做到呢?
比如下面

public void method(){
    updatesomthing();
    doOtherSomthing();
}

我希望updatesomthing方法执行完,就提交事务而不是等到method方法执行完才提交事务,请问怎么做?请输入代码

piano 208
2015-11-06 提问
1 个回答
1

已采纳

先跟题主确定一下,你的目的是提交事务,还是让 updateSomething() 的 Sql 先执行掉。因为我有过类似的需求,所以会这样推测。

提交事务

如果是提交事务,那需要先得到事务的控制权,手动控制事务。
spring 事务的话可以通过注入或 getBean 的方式拿到 transactionManager。就是 xml 中类似如下配置的 bean:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

代码可以类似这样:

// 非工程内,就这么写了,这个应该是 ApplicationContext 中的 bean
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
// 事物隔离级 ……
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
//   ……
TransactionStatus status = transactionManager.getTransaction(definition);// 获得事务状态
try {
    // 你的代码,更新
    //updateSomething();
    transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
}
// 其他代码……
//doOtherSomething();

先执行部分SQL

如果是先执行部分 SQL 不提交的倒没必要这么麻烦。一种简便的方法就是随便执行条 select 语句就可以了:)。这样虽然事务没提交但是之前的SQL是会先执行的。
这个SQL可以是这样:

select 1 from dual -- oracle

用 Mybatis 接口的话可以是这样:

@Repository
public interface SomeSqlMapper {

    /**
     * @return 1
     */
    @Select("select 1 from dual")
    int execute();

}

当然了,这种算黑科技 ^ ^ 。如果有更优雅简便的方法请与我分享。

撰写答案

推广链接