gpt4 book ai didi

java - JPA 多线程添加如果不存在?

转载 作者:行者123 更新时间:2023-12-04 23:51:13 25 4
gpt4 key购买 nike

我有一个服务器函数,它被许多客户端同时多次调用。服务器功能执行以下操作:

  • 从客户端获取 param1
  • 创建对象x(新对象x(param1))
  • 检查对象 x 是否存在于 db (jpa select query)
  • 如果不存在,则添加对象 x​​(jpa 存储实体)
  • 添加 y(jpa 商店实体)

  • 当两个或多个客户端同时运行该函数时,这会出错,多个 x 对象被添加到数据库中。

    我只是通过创建一个具有上述同步方法的单例管理器类来解决这个问题。

    效果很好,因为现在一次只能由一个客户端调用该函数。 (但是当有 2 个服务器时我确实遇到了问题,但事实并非如此)

    但我想知道有没有更好的方法可以用 jpa 解决这个问题?

    最佳答案

    是的,这整个操作应该在一个事务中执行,例如由 JTA 或 Spring 的 @Transactional 提供。 .如果事务被隔离在适当的级别(我认为 REPEATABLE_READ 对于这种情况),底层持久性系统将通过阻塞一个事务直到另一个事务完成(本质上是 synchronized)来确保不会发生冲突写入。在 Java 中执行),或者在检测到冲突时停止并回滚第二个事务(然后您可以重试)。

    关于java - JPA 多线程添加如果不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21755787/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com