在事务中切换线程是一种不好的做法吗?
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();
}
- openTx/closeTx() 是PlatformTransactionManager 的简单封装,.block() 是用来保持这个线程不受其他Transaction影响的,它们能正常工作吗?
- Mono<> 用于切换线程,这限制了对spring-data 的JpaRepository 的并发调用,有没有更好的方法来限制?
更新:
尽管如果 运行 在一个线程中同步,代码可能会更常规,但是当有很多这样的线程时,可能会出现问题。
假设 1000 个线程在它们自己的线程中完成所有工作,它们可能会导致高 cpu 争用。
相反,如果我们将作业卸载到有限的线程,让这 1000 个线程等待某个结果,cpu 争用应该会减少。
所以,如果交易在其中运行良好,我可能更喜欢原始的线程跳舞代码。
回答你的问题,是的,在事务中切换线程是一种不好的做法。但是您的代码似乎并没有这样做,它只是使用一种非常规的方式来锁定共享资源。
事务内切换线程是不是自找麻烦?
由于以下代码是阻塞一个线程并在其他线程中做事,这似乎是一种浪费,必须有比这更好的方法,欢迎任何建议或想法。提前致谢。
我正在尝试从数据库加载 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();
}
- openTx/closeTx() 是PlatformTransactionManager 的简单封装,.block() 是用来保持这个线程不受其他Transaction影响的,它们能正常工作吗?
- Mono<> 用于切换线程,这限制了对spring-data 的JpaRepository 的并发调用,有没有更好的方法来限制?
更新:
尽管如果 运行 在一个线程中同步,代码可能会更常规,但是当有很多这样的线程时,可能会出现问题。
假设 1000 个线程在它们自己的线程中完成所有工作,它们可能会导致高 cpu 争用。
相反,如果我们将作业卸载到有限的线程,让这 1000 个线程等待某个结果,cpu 争用应该会减少。
所以,如果交易在其中运行良好,我可能更喜欢原始的线程跳舞代码。
回答你的问题,是的,在事务中切换线程是一种不好的做法。但是您的代码似乎并没有这样做,它只是使用一种非常规的方式来锁定共享资源。