【问题标题】:Is it a bad practice to switch threads within a transaction?在事务中切换线程是一种不好的做法吗?
【发布时间】: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();
}
  1. openTx/closeTx() 是PlatformTransactionManager 的简单封装,.block() 是用来防止这个线程与其他Transaction 接触的,它们能正常工作吗?
  2. Mono用于切换线程,限制并发调用spring-data的JpaRepository,有没有更好的方法来做限制?

更新:

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

假设 1000 个线程在自己的线程中执行所有作业,它们可能会导致高 CPU 争用。

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

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

【问题讨论】:

  • 感觉是一个非常非常糟糕的主意。我想知道你为什么还要问。
  • 那么,我想我不应该在事务中切换线程吗?我问是因为我想知道如何正确地进行交易,如果我的代码离那太远了,对不起。
  • 做对了吗?不要切换线程。

标签: java spring-transactions project-reactor


【解决方案1】:

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

【讨论】:

  • 我想如果我像这样重新编码:@Transactional public SomeThing updateSomething(int i) { Something st = loadSomethingFromDbById(i); st.doSomeChange();返回 saveSomethingToDb(st);它更传统,但不能并行执行,例如同时发出两个http请求。那是对的吗?抱歉,格式不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2013-08-24
  • 2015-05-31
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多