代码之家  ›  专栏  ›  技术社区  ›  Juriy

同步实体访问器

  •  3
  • Juriy  · 技术社区  · 14 年前

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

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

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

    提前谢谢!

    2 回复  |  直到 14 年前
        1
  •  4
  •   Pascal Thivent    14 年前

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

    pessimistic concurrency 您可以读取一个实体并在数据库级别锁定相应的行(注意,所提到的链接早于jpa2.0规范的最终版本,并不能反映 LockMode

    如果您使用的是jpa1.0,恐怕您必须使用本机SQL来执行相同的操作 SELECT ... FOR UPDATE .

    工具书类

    • JPA2.0规范
      • 第3.4.4节“锁定模式”