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