在事务中切换线程是一种不好的做法吗?

Is it a bad practice to switch threads within a transaction?

事务内切换线程是不是自找麻烦?

由于以下代码是阻塞一个线程并在其他线程中做事,这似乎是一种浪费,必须有比这更好的方法,欢迎任何建议或想法。提前致谢。

我正在尝试从数据库加载 Something 并在进行一些更改后保存它:

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() 是用来保持这个线程不受其他Transaction影响的,它们能正常工作吗?
  2. Mono<> 用于切换线程,这限制了对spring-data 的JpaRepository 的并发调用,有没有更好的方法来限制?

更新:

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

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

相反,如果我们将作业卸载到有限的线程,让这 1000 个线程等待某个结果,cpu 争用应该会减少。

所以,如果交易在其中运行良好,我可能更喜欢原始的线程跳舞代码。

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