【发布时间】: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 无论如何都不是线程安全的。因此,除非您对每个线程一个会话感到满意,否则请避免这种情况。