我们知道,如果所有默认值都适用,则两个线程同时操作同一实体将抛出 OptimisticLockException
。如果线程操作的字段用注释 @Transient
或修饰符 transient
标记,会发生什么?
我的直觉告诉我们,持久化提供者不会打扰我们对 transient 字段的处理以及它们的访问方式。这进一步告诉我,如果我们认为同步机制在我们的应用程序中足够重要,则应该将同步机制应用于这些字段。
但是,我用 google 搜索了所有 Java EE 书籍和 JPA 2.0 规范,但找不到这个“问题”得到解决。这告诉我我一定在这里遗漏了一些东西并且我过于担心了??
最佳答案
仅当实体中存在 @Version 字段,并且事务尝试保存自实体状态已加载以来已被另一个事务修改的实体时,才会使用 OptimisticLockException。
每个事务都有其自己加载的每个实体的实例。实体不是线程安全的,并且不能被多个线程共享。
JPA 确实完全忽略了 transient 字段。但我不明白同步如何改变任何事情,因为每个线程都有自己的实体实例。此外,在大多数企业应用程序中,多个 JVM 使用相同的数据库,因此同步对此没有帮助。坦率地说,在实体中使用 transient 字段通常会出现设计问题,并且依赖实体中 transient 字段的状态来保存多个线程共享的状态是完全错误的。如果状态由多个线程甚至进程共享,则可能应该将其保存在数据库中。
关于jakarta-ee - JPA 实体的 transient 字段是否需要并发同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16365690/