2011-07-07 80 views
1

我正在使用Eclipse链接实现,但也许这与Hibernate相关。 在某些时候,我叫:JPA锁定是否被视为原子?

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

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

令人惊讶的是 - 在@Version字段上放置了一个断点后,似乎有很多电话拨打entity._persistence_getentity._persistence_set

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

当不在发布模式时,会发生这种变化吗?还是仅仅因为调试器?

问候, 丹尼尔

+0

我不确定我是否理解你的问题。你是什​​么意思的原子?一个连接的实体不应该在几个线程中使用。 –

+0

Atomic =操作期间不允许上下文切换。 – Daniel

回答

0

没有办法(据我所知),以防止上下文切换的Java。因此,我不明白在这个意义上锁定是如何成为原子的。但是我也不明白为什么它很重要,因为附属实体不应该被多个线程同时使用。

+0

有没有办法防止这种情况发生?如果两个用户试图同时更新相同的字段 - 如何防止它发生?我认为锁定是唯一的解决方案。 – Daniel

+0

锁定用于防止在数据库**中同时修改一行**。它几乎与线程无关:两个事务可能在两个不同的JVM上运行。由锁造成的版本字段的增量会使两个并发事务中的一个事务回滚,但有一个例外。但是线程上下文切换对机制没有任何影响。请阅读http://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and以获取解释。 –