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

Java 在事务中切换线程是一种不好的做法吗?,java,spring-transactions,project-reactor,Java,Spring Transactions,Project Reactor,我想知道在事务中切换线程是否只是自找麻烦 由于下面的代码阻塞了一个线程,而在其他线程中执行操作,这似乎是一种浪费,必须有更好的方法,欢迎提供任何建议或想法。提前谢谢 我正在尝试从数据库加载某些内容,并在进行一些更改后保存它: public Mono<SomeThing> updateSomething(int i) { TransactionStatus tx = openTx(); return Mono.just(i) .publishOn(wor

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

由于下面的代码阻塞了一个线程,而在其他线程中执行操作,这似乎是一种浪费,必须有更好的方法,欢迎提供任何建议或想法。提前谢谢

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

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();
}
公共Mono更新方法(inti){
TransactionStatus tx=openTx();
返回Mono.just(i)
.publishOn(workerThread)
.flatMap(this::loadSomethingFromDbById)
.map(某物::doSomeChange)
.flatMap(此::saveSomethingToDb)
.publishOn(Schedulers.immediate())
.doFinally(s->closeTx(s));
}
public void blockingUpdateSomething(){
updateMething(1.block();
}
  • openTx/closeTx()是PlatformTransactionManager的简单包装,而.block()用于防止此线程与其他事务发生冲突,它们能正常工作吗
  • Mono用于切换线程,这限制了对spring数据的JpaRepository的并发调用,有更好的方法来限制吗
  • 更新:

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

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

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


    因此,如果事务在这方面工作得很好,我可能更喜欢原始的线程舞蹈代码。

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

    感觉这是一个非常非常糟糕的主意。我想知道你们为什么要问。所以,我想我不应该在事务中切换线程?我问这个问题是因为我想知道如何正确处理事务,如果我的代码离那个太远,很抱歉。正确吗?不要切换线程。我想如果我像这样重新编码:@Transactional public SomeThing updatemething(int I){SomeThing st=loadSomethingFromDbById(I);st.doSomeChange();return savesomething todb(st);}更为传统,但不能并行处理,例如,同时发出两个http请求。对吗?很抱歉设置了格式,无法将其正确设置。