我有两个(或更多)Java 线程使用 JPA 从 mysql 数据库创建、更新和删除实体。为了实现这一目标,我有一个 PersistenceLayer 类创建 EntityManager 并为我的所有实体提供保存、更新和删除方法,如下所示:
public void saveEntity(Entity entity) {
manager.getTransaction().begin();
manager.persist(entity);
manager.getTransaction().commit();
}
public void saveEntity2(Entity2 entity) {
manager.getTransaction().begin();
manager.persist(entity);
manager.getTransaction().commit();
}
如果一个线程同时进入 saveEntity 操作,另一个线程同时进入 saveEntity2 操作,则两个线程都会尝试从 EntityManager 获取事务,但会失败。然而,我一直认为底层数据库能够管理多个事务,特别是当两个事务都在不同的行甚至不同的表上工作时。当然,我可以同步这些块,但这意味着一次只能有一个数据库连接,这将无法扩展到创建多个线程的多个用户。
我在这里做了什么错误的假设?是否可以通过JPA向数据库提交多个事务并让DB处理并发问题?
EntityManager
不适合由多线程使用。您需要获取单独的实例EntityManager
对于每个线程。
实际上,如果您使用 EJB 或 Spring,您可以使用事务范围的EntityManager
,它可以在多个线程中使用(它是一个代理,它将实际工作委托给单独的线程绑定实例EntityManager
),但我认为这不是你的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)