spring+mybatis事务管理

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

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

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

阅读 3.4k
评论
    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();
    
    }

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

      撰写回答

      登录后参与交流、获取后续更新提醒