JPA方法EntityManager#lock是否立即对内存中的托管实体实例产生影响,或者只是按需将语义路由到数据库?
答案 0 :(得分:1)
仅当您使用悲观锁定类型之一时,才会立即使用EntityManager#lock进行锁定。
使用悲观锁定类型将锁定指令路由到数据库并等待,直到锁定成功或达到超时。因此,呼叫是阻塞的,如果不成功,则回滚事务。
对内存中对象的直接影响是间接的,但是立即 - 如果未获得锁定,则回滚事务并且无法成功完成事务。在此之后修改实体对象是没有意义的,因为它们不会被持久化。但理论上,如果你捕获LockTimeoutException,就可以像修改任何其他普通Java对象那样修改和使用实体对象,但我不建议这样做。
如果您使用乐观锁定,那么从其性质来看,只有在检测到冲突后才会回滚事务。这只能在实体持久存储到数据库<时出现(通常在事务结束时,但也可能在中间刷新期间发生)。乐观锁定的关键是在很明显发生碰撞时稍后进行锁定。
有关JPA锁定机制的非常好的文档可以在这个Locking in JPA页面中找到。