我们知道,如果所有默认值都适用,则同时操作同一实体的两个线程将抛出OptimisticLockException
。如果操作线程的字段标有注释@Transient
或修饰符transient
,会发生什么?
我的直觉说持久性提供者不应该打扰我们对瞬态字段的处理方式以及如何访问它们。这进一步告诉我,如果我们认为在我们的应用程序中足够重要,同步机制应该应用于这些领域。
但是,我搜索了所有Java EE书籍和JPA 2.0规范,但我找不到这个“问题”。这告诉我,我必须在这里遗漏一些东西而且我过分担心?
答案 0 :(得分:1)
只有在实体中存在@Version字段,并且事务尝试保存已被其他事务修改的实体,因为实体的状态已被加载时,才会使用OptimisticLockException。
每个事务都有自己加载的每个实体的实例。实体不是线程安全的,不能由多个线程共享。
JPA确实完全忽略了瞬态字段。但是我没有看到同步如何改变任何东西,因为每个线程都有自己的实体实例。此外,在大多数企业应用程序中,多个JVM使用相同的数据库,因此同步对此没有帮助。坦率地说,在实体中使用瞬态字段通常会显示设计问题,并且依赖于实体中的瞬态字段的状态来保持多个线程共享的状态是完全错误的。如果状态由多个线程甚至进程共享,则应该将其保存在数据库中。