JPA:读锁是如何工作的?

7

我正在尝试理解调用EntityManager.lock(entity, LockModeType.READ)的效果。对我来说,API文档听起来很混乱。

如果有两个并发线程,线程1调用lock(entity, LockModeType.READ),线程2是否仍然可以读写该实体?

到目前为止,我学到的:

JPA1中的锁类型READ与JPA2中的OPTIMISTIC相同。如果设置此类锁定,则EntityManager在提交事务之前检查版本属性,但不更新它。我找到了关于OPTIMISTIC锁模式的解释:链接。搜索OPTIMISTIC(READ)LockMode示例。 就我所知,在线程1中设置读锁对线程2 … n没有影响。所有其他线程仍然可以读写该实体。但是,当线程1中的事务提交且另一个线程已更新该实体时,线程1中的事务将被回滚。

我的理解是否正确?

1个回答

4

目前而言,READ已被弃用,但只是为了让您了解:

READ锁将确保对象状态在提交时不会更改,因为READ锁允许其他事务更新或删除它,然后如果线程1进行了一些更改并提交,它首先检查实体的状态(版本)如果检查通过,则被提交,否则不允许提交。

因此,基本上您的理解是正确的。

还有一种现代使用方法,即OPTIMISTIC_READ(还有_WRITE)。

更新

好的,这篇文章帮助我很多地理解了,希望对您有所帮助。文章链接


我还是不明白。有人可以重新构造句子或添加一个例子吗? - stoefln
我更新了我的回答,请检查我提供的链接。 - engma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接