我试图了解调用EntityManager.lock(entity,LockModeType.READ)的效果。 API文档对我来说听起来很混乱。
如果我必须并发线程并且线程1调用lock(entity,LockModeType.READ),那么线程2是否仍然可以读写实体?
到目前为止我学到了什么:
JPA1中的锁定类型READ与JPA2中的OPTIMISTIC相同。如果设置了这样的锁,EntityManager会在提交事务之前检查版本属性,但不会更新它。我找到了OPTIMISTIC锁定模式的解释:Link。搜索OPTIMISTIC(READ)LockMode示例。 正如我所理解的那样,在线程1中设置读锁定对线程2 ... n没有影响。所有其他线程仍然可以读写实体。但是当线程1中的事务提交而另一个线程已更新实体时,线程1中的事务将被回滚。
我理解这是正确的吗?
答案 0 :(得分:4)
无论如何,只是为了您的理解而阅读已被弃用:
READ锁将确保对象的状态在提交时不会更改,因为READ锁允许其他事务更新或删除它然后如果线程1进行一些更改然后提交它首先检查状态(版本)如果实体检查,则提交,如果不允许,则提交,
基本上你的理解是正确的。
还有OPTIMISTIC_READ这是使用它的现代方式(也有_WRITE)。
<强>更新强>
好的,article帮助我理解希望这会有所帮助。