小编典典

同步对JPA EntityManager的访问

hibernate

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


阅读 351

收藏
2020-06-20

共1个答案

小编典典

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

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

锁定模式OPTIMISTIC是同义READOPTIMISTIC_FORCE_INCREMENTWRITE


编辑: 从文档

如果事务T1要求在版本控制对象上锁定类型为LockModeType.OPTIMISTIC的锁,则实体管理器必须确保不会发生以下两种现象:

* P1(脏读):事务T1修改一行。然后,另一个事务T2在提交或回滚之前读取该行并获取修改后的值。事务T2最终成功提交;T1提交或回滚以及在T2提交之前还是之后都这样做并不重要。

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

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

2020-06-20