我有一个服务器功能,很多客户端都在同一时间多次调用它。服务器功能执行以下操作:

  • 从客户端
  • 获取param1
  • 创建对象x(新对象x(param1))
  • 检查db中是否存在对象x(jpa选择查询)
  • (如果不存在)添加对象x(jpa商店实体)
  • 添加y(jpa商店实体)

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

    我只是通过使用执行上述操作的同步方法创建一个单例管理器类来解决此问题。

    效果很好,因为现在该功能一次只能由一个客户端调用。 (但是当有2台服务器时,我确实遇到了问题,但是还不是这样)

    但是我想知道是否有更好的方法用jpa解决此问题?

    最佳答案

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

    08-03 22:24
    查看更多