【问题标题】:Is JPA locking considered atomic?JPA 锁定是否被认为是原子的?
【发布时间】:2011-07-07 08:41:13
【问题描述】:

我正在使用 Eclipse Link 实现,但也许这也与 Hibernate 相关。 在某个时候,我打电话给:

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

我认为这是一个原子操作。

令人惊讶的是 - 在 @Version 字段上设置断点后,似乎有很多对 entity._persistence_get 和 entity._persistence_set 的调用。

显然 - 可以使用调试器到达同一点,使用两个浏览器,并在线程仍在运行这些隐藏功能时在线程之间切换。完成后 - 两个线程都不可能稍后刷新/提交。

在不处于发布模式时是否会发生这种变化,或者仅仅是因为调试器?

问候, 丹尼尔

【问题讨论】:

  • 我不确定我是否理解您的问题。你说的原子是什么意思?一个附加的实体不应该在多个线程中使用。
  • Atomic=操作期间不允许上下文切换。

标签: hibernate jpa ejb-3.0 eclipselink


【解决方案1】:

没有办法 (AFAIK) 防止 Java 中的上下文切换。因此,我看不出从这个意义上说锁定如何是原子的。但我也不明白为什么这很重要,因为一个附加的实体不应该被多个线程同时使用。

【讨论】:

  • 有没有办法防止这种情况发生?如果两个用户试图同时更新同一个字段 - 如何防止它发生?我认为锁定是唯一的解决方案。
  • 锁定用于防止同时修改数据库中的行。它几乎与线程无关:两个事务可能在两个不同的 JVM 上运行。由锁引起的版本字段的递增将使两个并发事务之一发生异常回滚。但是线程上下文切换对机制没有任何影响。阅读blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and 以获得解释。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 2011-06-12
  • 2016-06-07
  • 2020-06-19
  • 2014-01-13
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多