关于线程安全和JPA EntityManager

时间:2014-03-29 14:34:59

标签: java multithreading jpa

假设我们有两个相互依赖的实体和每个实体的DAO

Entity1 -> * Entity2
Entity2 

现在假设我们有两个线程从数据库中提取一些数据,Thread1要求Entity1Dao获取一些初始化依赖字段的对象,同时Thread2尝试使用Entity2Dao获取相同的Entity2对象(已经检索过)。

Entity1Dao创建EntityManager(em1)并检索数据,Entity2Dao将创建不同的EntityManager(em2)以从数据库中获取查询对象。

问题:在em1关闭之前em2是否保持锁定状态?如果不是,我们是否应该在“包含请求对象的其他实体管理器”上获得异常?

2 个答案:

答案 0 :(得分:4)

没有。每个EntityManager都将返回实体的不同实例。

然后,并发事务可能会写入相同的行,最后一个将获胜,除非您实现乐观并发(通过向实体添加@Version字段)。

答案 1 :(得分:3)

在这种情况下,实体经理完全独立。 JPA提供了optimistic lockingpessimistic locking的机制,您可以使用这些机制来协调在处理相同数据的两个事务期间应该发生的事情。

请参阅JPA 2.1 Specification,第3.4节关于锁定和并发。