2

我们知道两个线程同时操作同一个实体,会抛出一个OptimisticLockExceptionif all defaults apply。如果线程操作的字段被标记了注释@Transient或修饰符会发生transient什么?

我的直觉是持久化提供者不会打扰我们对瞬态字段所做的事情以及如何访问它们。这进一步告诉我,如果我们认为同步机制在我们的应用程序中足够重要,那么应该将同步机制应用于这些领域。

但是,我搜索了我所有的 Java EE 书籍和 JPA 2.0 规范,但我找不到这个“问题”得到解决。这告诉我我必须在这里遗漏一些东西并且我过度担心?

4

1 回答 1

2

OptimisticLockException 仅在实体中有 @Version 字段时使用,并且如果事务尝试保存自加载实体状态以来已被另一个事务修改的实体。

每个事务都有它自己加载的每个实体的实例。实体不是线程安全的,不能由多个线程共享。

JPA 确实完全忽略了瞬态字段。但我看不出同步如何改变任何东西,因为每个线程都有自己的实体实例。此外,在大多数企业应用程序中,多个 JVM 使用同一个数据库,因此同步在这方面无济于事。坦率地说,在实体中使用瞬态字段通常会显示设计问题,并且依靠实体中瞬态字段的状态来保持由多个线程共享的状态是完全错误的。如果状态由多个线程甚至进程共享,它可能应该保存在数据库中。

于 2013-05-03T19:18:18.130 回答