每当我要保留任何实体时,都会执行以下代码。看起来一切正常,但我不明白它是如何工作的!
EntityManager em = getEntityManager(); EntityTransaction userTransaction = em.getTransaction(); userTransaction.begin(); em.persist( ent ); userTransaction.commit();
上面的EntityManager是整个应用程序共享的单个实例。开始交易后;我只是说em.persist(entity)..hibernate如何知道它属于哪个事务!
假设我的应用程序上有10个并发用户,并且所有10个线程都在执行上述代码。因此,正在创建和提交10个独立的事务。但是我并没有将所有10个不同的实体与它们各自的交易相关联。那么JPA如何解决呢!
根据答案;我们有以下内容;我们是说每个线程应该有一个EntityManager实例吗?那不是杀死服务器吗?我们应该合并这些实例吗?是否等于重新实现某种类型的连接池?
之所以有效,是因为您足够幸运。足够幸运的是,以正确的顺序调用了commit和begin-偶然地。
您确实从多个线程使用了实体管理器的单个实例。这样做是错误的,因为不能保证它是线程安全的。通过EntityTransaction对资源级事务的访问绑定到实体管理器实例,而不是线程。
因此,结果是您共享同一个EntityTransaction,并幸运地将其连续用于多个事务。串行使用它来终止和终止多个事务是可以的,但是从多个线程使用它不是。
在hibernate(4.1.4)中,引用存储到AbstractEntityManageImpl类中的tx实例字段,但这只是实现细节。