在事务中切换线程是否是错误的做法?

时间:2018-11-16 01:20:42

标签: java spring-transactions project-reactor

我想知道是否在事务中切换线程只是在问麻烦?

由于以下代码阻塞了一个线程并在其他线程中执行操作,因此似乎很浪费,因此必须有比这更好的方法,欢迎任何建议或想法。预先感谢。

我正在尝试从数据库中加载某些内容并进行一些更改后将其保存:

public Mono<SomeThing> updateSomething(int i) {
    TransactionStatus tx = openTx();
    return Mono.just(i)
        .publishOn(workerThread)
        .flatMap(this::loadSomethingFromDbById)
        .map(Something::doSomeChange)
        .flatMap(this::saveSomethingToDb)
        .publishOn(Schedulers.immediate())
        .doFinally(s -> closeTx(s));
}

public void blockingUpdateSomething() {
    updateSomething(1).block();
}
  1. openTx / closeTx()是PlatformTransactionManager的简单包装,而.block()用于阻止该线程与其他事务一起使用,它们是否可以正常工作?
  2. Mono <>用于切换线程,这限制了对spring-data的JpaRepository的并发调用,是否有更好的方法来执行限制?

更新:

尽管如果在一个线程中同步运行这些代码可能会更常规,但是当有很多这样的线程时可能会出现问题。

假设1000个线程在自己的线程中完成所有作业,它们可能会导致较高的cpu争用。

相反,如果我们将作业卸载到有限的线程中,而使那1000个线程等待某些结果,则cpu争用应该更少。

因此,如果事务处理效果很好,我可能更喜欢原始的线程跳舞代码。

1 个答案:

答案 0 :(得分:0)

回答您的问题,是的,在事务中切换线程是一种不好的做法。但是您的代码似乎并没有这样做,只是使用一种非常规的方式来锁定共享资源。