JPA方法EntityManager#lock是立即对内存中的托管实体实例生效,还是将按需语义路由到DB?
发布于 2015-10-01 02:55:13
使用EntityManager#lock进行锁定只有在使用悲观锁类型时才是即时的。
使用悲观锁类型将锁指令路由到DB,并等待直到锁成功或到达超时。因此,调用是阻塞的,如果不成功,事务将回滚。
对内存中的对象的直接影响是间接的,但是立即-如果没有获得锁,事务就回滚,并且不可能成功地完成事务。在此之后修改实体对象是没有意义的,因为它们不会被持久化。但理论上,只要您捕获LockTimeoutException,就可以像对任何其他普通Java对象一样修改和处理实体对象,但我不建议这样做。
如果使用乐观锁定,则从本质上看,只有在检测到冲突后才回滚事务。这种情况只能在实体被持久化到DB (通常在事务结束时发生,但也可以在中间刷新时发生)的时候发生。乐观锁定的要点是在很明显的碰撞发生的稍后时刻解除锁定。
关于JPA锁定机制的非常好的文档可以在这个锁定在JPA中页面中找到。
https://stackoverflow.com/questions/32865920
复制