JPA方法EntityManager#lock是对内存中托管实体实例立即生效还是只是将语义按需路由到数据库?
仅当您使用悲观锁类型之一时,才使用EntityManager#lock进行锁定。
使用悲观锁类型将锁定指令路由到DB,并等待直到锁定成功或达到超时为止。因此,该呼叫正在阻塞,并且如果未成功,则事务将回滚。
这样,对内存中对象的即时影响是间接的,但是即时的-如果未获得锁定,则事务将回滚,并且无法成功完成事务。此后修改实体对象是没有意义的,因为它们将不会持久化。但是从理论上讲,只要您捕获LockTimeoutException,就可以像其他任何普通Java对象一样修改和使用实体对象,但是我不建议这样做。
如果使用乐观锁定,则从其本质上讲,只有在检测到冲突之后,事务才会回滚。仅当实体将持久存储在数据库中时(通常在事务结束时,但也可能在中间刷新期间发生),才会发生这种情况。乐观锁定的目的是在明显发生碰撞的稍后时间延迟锁定。
关于JPA锁定机制的很好的文档可以在“ JPA锁定”页面中找到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句