3

这是设置:实体类具有延迟加载的其他实体的集合。诀窍是,我需要执行一些与数据相关的工作(例如,我想用集合的元素计算某些校验和)。

这里的诀窍是我想不惜一切代价避免竞争条件,例如:“有人在我进行数据计算时更新了实体”。在正常情况下,我只会声明 getter/setter 同步并且会对此感到满意。但据我了解,如果另一个线程决定从数据库更新实体状态,而我正在计算校验和,它将完全忽略“同步”方法(它将直接访问该字段)。

我可能错了强硬。所以问题是:在初始校验和计算时,有没有办法“锁定”对实体部分或整个实体本身的访问?

提前致谢!PS如果您需要代码片段来说明问题 - 请告诉我。到目前为止,我认为这个问题很清楚。

4

2 回答 2

4

我可能错了强硬。所以问题是:在初始校验和计算时,有没有办法“锁定”对实体部分或整个实体本身的访问?

JPA 2.0 支持悲观并发,您可以读取实体并在数据库级别锁定相应的行(请注意,提到的链接早于 JPA 2.0 规范的最终版本,并且不反映LockMode枚举的所有可能值,但是您明白了)。

如果您使用的是 JPA 1.0,恐怕您将不得不使用本机 SQL 来执行等效的SELECT ... FOR UPDATE.

参考

  • JPA 2.0 规范
    • 第 3.4.4 节“锁定模式”
于 2010-09-24T05:25:16.170 回答
1

您还可以在实体的属性上使用@Version(在 JPA 1.0 中工作)

http://java.dzone.com/articles/jpa-20-concurrency-and-locking

于 2011-09-21T14:00:16.787 回答