我正在使用 Spring、Hibernate 和 JPA 实体管理器。当同时(通过 jquery/ajax)获取 UI 的不同区域时,我想同步对 JPA 实体管理器的访问,否则会导致对集合异常的共享引用。我该如何做到这一点?我有一个控制器,它在后端调用服务方法,这些方法负责在 entitymanager 上调用 get/save 等。
问问题
3280 次
1 回答
1
您可以使用特定模式对对象应用锁定。
- 实体经理:
entityManager.lock(entity, LockModeType.OPTIMISTIC);
- 询问 :
query.setLockMode(LockModeType.OPTIMISTIC);
- NamedQuery : lockMode 元素
锁定模式OPTIMISTIC
是READ
& OPTIMISTIC_FORCE_INCREMENT
to的同义词WRITE
。
编辑:来自文档
如果事务 T1 在版本化对象上调用 LockModeType.OPTIMISTIC 类型的锁,实体管理器必须确保不会发生以下任何一种现象:
P1(脏读):事务 T1 修改了一行。然后另一个事务 T2 在 T1 提交或回滚之前读取该行并获得修改后的值。事务 T2 最终提交成功;T1 是提交还是回滚以及它是在 T2 提交之前还是之后提交都无关紧要。
P2(不可重复读取):事务 T1 读取一行。然后另一个事务 T2 在 T1 提交之前修改或删除该行。两个事务最终都成功提交。
锁定模式必须始终防止出现 P1 和 P2 现象。
于 2012-06-08T11:52:22.340 回答