我想知道是否在事务中切换线程只是在问麻烦?
由于以下代码阻塞了一个线程并在其他线程中执行操作,因此似乎很浪费,因此必须有比这更好的方法,欢迎任何建议或想法。预先感谢。
我正在尝试从数据库中加载某些内容并进行一些更改后将其保存:
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();
}
更新:
尽管如果在一个线程中同步运行这些代码可能会更常规,但是当有很多这样的线程时可能会出现问题。
假设1000个线程在自己的线程中完成所有作业,它们可能会导致较高的cpu争用。
相反,如果我们将作业卸载到有限的线程中,而使那1000个线程等待某些结果,则cpu争用应该更少。
因此,如果事务处理效果很好,我可能更喜欢原始的线程跳舞代码。
答案 0 :(得分:0)
回答您的问题,是的,在事务中切换线程是一种不好的做法。但是您的代码似乎并没有这样做,只是使用一种非常规的方式来锁定共享资源。