jakarta-ee - JPA 实体的 transient 字段是否需要并发同步?

标签 jakarta-ee jpa concurrency transient

我们知道,如果所有默认值都适用,则两个线程同时操作同一实体将抛出 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/

相关文章:

java - 大对象不能在自动提交模式下使用

java - 由于实体脏度检查,SpringBoot/Hibernate 在只读事务下触发来自 find 存储库方法的更新查询

java - 使用自己的 int 容量是否比使用数组的 .length 字段更快?

java - encodeURL 和 encodeRedirectURL 之间的区别

java - OSGi 与 JPA : Service not starting although code seems ok

java - 同一方法中两个不同过程调用的相同可调用语句变量

java - 如何同时修改 Vector

java - Javafx:javafx.concurrent和Platform.runLater之间的区别?

java - 在 servlet 或托管 bean 处连接到数据库

java - J2SE JNDI : Issue starting standalone JNP server