spring+mybatis事务管理

发布于 2022-09-01 20:42:22 字数 231 浏览 13 评论 0

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

和影子一齐双人舞 2022-09-08 20:42:22

先跟题主确定一下,你的目的是提交事务,还是让 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();

}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文