我正在使用Spring,Hibernate和JPA实体管理器。当同时获取UI的不同区域时(通过jquery / ajax),我想同步访问JPA实体管理器,否则会导致对集合异常的共享引用。我该如何实现这一目标?我有一个控制器,它在后端调用服务方法,负责在entitymanager上调用get / save等。
答案 0 :(得分:1)
您可以使用特定模式对对象应用锁定。
entityManager.lock(entity, LockModeType.OPTIMISTIC);
query.setLockMode(LockModeType.OPTIMISTIC);
锁定模式OPTIMISTIC
与READ
同义。 OPTIMISTIC_FORCE_INCREMENT
至WRITE
。
修改:来自文档
如果事务T1调用了LockModeType.OPTIMISTIC类型的锁 一个版本化的对象,实体管理器必须确保两者都没有 可能会出现以下现象:
P1(脏读):事务T1修改一行。然后,另一个事务T2读取该行并在T1具有之前获得修改的值 承诺或回滚。事务T2最终提交 成功; T1是否提交或回滚并不重要 是否在T2提交之前或之后这样做。
P2(不可重复读取):事务T1读取一行。然后,另一个事务T2在T1之前修改或删除该行 承诺。两个事务最终都成功提交。
锁定模式必须始终防止P1和P2现象。