JPA:Read Lock如何工作?

rub*_*uck 7 java concurrency jpa locking optimistic-locking

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

如果我必须并发线程并且线程1调用lock(实体,LockModeType.READ),那么线程2仍然可以读写实体吗?

到目前为止我学到了什么:

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

我理解这是对的吗?

eng*_*gma 4

无论如何,阅读目前已被弃用,但仅供您理解:

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

所以基本上你的理解是正确的。

还有 OPTIMISTIC_READ 这是使用它的现代方式(还有 _WRITE)。

更新

好吧,这篇文章对我的理解帮助很大,希望这会有所帮助。