2

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

4

1 回答 1

1

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

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

锁定模式OPTIMISTICREAD& OPTIMISTIC_FORCE_INCREMENTto的同义词WRITE


编辑:来自文档

如果事务 T1 在版本化对象上调用 LockModeType.OPTIMISTIC 类型的锁,实体管理器必须确保不会发生以下任何一种现象:

  • P1(脏读):事务 T1 修改了一行。然后另一个事务 T2 在 T1 提交或回滚之前读取该行并获得修改后的值。事务 T2 最终提交成功;T1 是提交还是回滚以及它是在 T2 提交之前还是之后提交都无关紧要。

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

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

于 2012-06-08T11:52:22.340 回答