【问题标题】:Spring @Transaction(readOnly = true) propagation to threadsSpring @Transaction(readOnly = true) 传播到线程
【发布时间】:2018-06-13 10:07:55
【问题描述】:
    @Transactional(readOnly=true)
    public void upper(){
     for(int i=0;i<10;i++){
     executorService.submit(()->{
        lower();
    });
    }
    }

    public void lower(){

    }

我在 Spring 中有上述代码。是否将 transactional(readOnly = true) 传播到执行器服务中的线程,并且不允许在较低的方法中进行任何 DB 修改? 我们正在使用 Hibernate ORM 和 MySql 数据库

【问题讨论】:

  • 实体管理器不是线程安全的。您需要为每个线程手动创建一个新线程。
  • 据我所知,答案是否定的。更重要的是:你为什么希望它是“是”?同一个数据库连接上的同步时间不会杀死任何收益吗?它会与多个用户以及每个连接模型的线程一起扩展吗?它通常不是那么清楚。有一个用例,但它并不是那么微不足道,所以在使用这种线程模式之前我会考虑两次。更不用说:休眠会话/EntityManager 无论如何都不是线程安全的。因此,除非您对每个线程一个会话感到满意,否则请避免这种情况。

标签: java spring hibernate


【解决方案1】:

它不会 - 它是基于每个线程的。此外,线程必须由Spring 管理才能正常工作。

【讨论】:

  • 弹簧方式的线程管理器..?? ExecutorService 在春季自动装配到应用程序中?如果我声明一个带有线程池的 ExecutorService,transactional(readonly = true) 将不适用?
  • @Pushparaj 这对我来说完全不清楚 - 下一个线程甚至没有 @Transactional 属性 - 根本不会有事务......你必须在那些里面手动创建事务线程。可能还有其他方法,但我不知道
  • 如果我像下面这样标记,线程会进入事务吗? @Transactiona(readOn;y = true) public void lower(){ }
  • @Transactionnal 仅适用于实例/类边界。 (您必须点击 AOP 代理,直接从实例中调用方法不会这样做)stackoverflow.com/questions/5109343/…
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多