7

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

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

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

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

我理解正确吗?

4

1 回答 1

4

无论如何,Read 目前已被弃用,但只是为了您的理解:

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

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

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

更新

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

于 2012-04-18T21:08:30.387 回答