【发布时间】:2019-04-19 04:28:21
【问题描述】:
我想知道在事务中切换线程是否只是自找麻烦?
由于下面的代码阻塞了一个线程而在其他线程中做事,看起来很浪费,一定有比这更好的方法,欢迎任何建议或想法。提前致谢。
我正在尝试从数据库中加载一些东西并在进行一些更改后保存它:
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();
}
- openTx/closeTx() 是PlatformTransactionManager 的简单封装,.block() 是用来防止这个线程与其他Transaction 接触的,它们能正常工作吗?
- Mono用于切换线程,限制并发调用spring-data的JpaRepository,有没有更好的方法来做限制?
更新:
虽然代码如果在一个线程中同步运行会更传统,但是当有很多这样的线程时可能会出现问题。
假设 1000 个线程在自己的线程中执行所有作业,它们可能会导致高 CPU 争用。
相反,如果我们将作业卸载到有限的线程,让这 1000 个线程等待某个结果,cpu 争用应该会减少。
所以,如果事务在其中运行良好,我可能更喜欢原始的线程跳舞代码。
【问题讨论】:
-
感觉是一个非常非常糟糕的主意。我想知道你为什么还要问。
-
那么,我想我不应该在事务中切换线程吗?我问是因为我想知道如何正确地进行交易,如果我的代码离那太远了,对不起。
-
做对了吗?不要切换线程。
标签: java spring-transactions project-reactor