在数据库中刷新对象之前,将返回光滑的更新操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数据库中刷新对象之前,将返回光滑的更新操作相关的知识,希望对你有一定的参考价值。

我遇到的情况是,当我在更新后立即获取对象时,有时我从数据库获得的结果不包含最新的更改。

这使我认为更新线程在对象实际在DB中提交之前返回。这是预期的行为吗?

我认为更新方法只会在更改成功刷新到数据库后返回,但看起来这样做无法保证。

下面是伪代码,展示了我在说什么。

def processObject = {
  for {
    objectId: Option[Long] <- saveObjectInDb

    _ <- {
     //perform other synchronous business logic and then update created object details
      dao.findById(objectId.get).map { objectOption: Option[MyObject] =>
        dao.update(objectOption.get.copy(processingStep = "third-step"))
      }
    }

    mostRecentMyObject <- dao.findById(objectId.get)
  } yield mostRecentMyObject
}

下面是我的update逻辑的样子

def update(myObject: MyObject): Future[Int] = {
  db.run(table.filter(_.id === myObject.id).update(myObject))
}
答案

问题是你没有考虑Future方法返回的内部update

鉴于findById的签名:

def findById(id: Long): Future[Option[MyObject]]

片段:

dao.findById(objectId.get).map { objectOption: Option[MyObject] =>
  dao.update(objectOption.get.copy(processingStep = "third-step"))
}

将给出Future[Future[Int]]类型的对象。

你应该在flatMap未来而不是map而不是findById,如下:

dao.findById(objectId.get).flatMap { objectOption: Option[MyObject] =>
  dao.update(objectOption.get.copy(processingStep = "third-step"))
}

这将简化为单个未来(Future[Int]),因此您可以确保只在插入后检索对象。

此外,您可以将其重写为:

def processObject = {
  for {
    objectId: Option[Long] <- saveObjectInDb

    objectOption <- dao.findById(objectId.get)

    _ <- dao.update(objectOption.get.copy(processingStep = "third-step"))

    mostRecentMyObject <- dao.findById(objectId.get)
  } yield mostRecentMyObject
}

因为,为了理解,<-flatMap的语法糖

以上是关于在数据库中刷新对象之前,将返回光滑的更新操作的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 脏检查和刷新缓存机制

你可以使用 Dapper 来刷新现有的对象引用而不是总是返回新的吗?

如何更新反应表的数据

ajax同步异步设置导致的问题及return返回值(返回ajax请求的数据)

Flutter中如何返回刷新上一页?

科研及工程实践中光纤涂覆机详细操作步骤(图文)