同步对JPA EntityManager的访问

时间:2012-06-07 10:48:01

标签: spring hibernate jpa

我正在使用Spring,Hibernate和JPA实体管理器。当同时获取UI的不同区域时(通过jquery / ajax),我想同步访问JPA实体管理器,否则会导致对集合异常的共享引用。我该如何实现这一目标?我有一个控制器,它在后端调用服务方法,负责在entitymanager上调用get / save等。

1 个答案:

答案 0 :(得分:1)

您可以使用特定模式对对象应用锁定。

  • 实体经理:entityManager.lock(entity, LockModeType.OPTIMISTIC);
  • 查询:query.setLockMode(LockModeType.OPTIMISTIC);
  • NamedQuery:lockMode元素

锁定模式OPTIMISTICREAD同义。 OPTIMISTIC_FORCE_INCREMENTWRITE


修改:来自文档

  

如果事务T1调用了LockModeType.OPTIMISTIC类型的锁   一个版本化的对象,实体管理器必须确保两者都没有   可能会出现以下现象:

     
      
  • P1(脏读):事务T1修改一行。然后,另一个事务T2读取该行并在T1具有之前获得修改的值   承诺或回滚。事务T2最终提交   成功; T1是否提交或回滚并不重要   是否在T2提交之前或之后这样做。

  •   
  • P2(不可重复读取):事务T1读取一行。然后,另一个事务T2在T1之前修改或删除该行   承诺。两个事务最终都成功提交。

  •   
     

锁定模式必须始终防止P1和P2现象。