gpt4 book ai didi

scala - 在 Slick 交易中做自己的事情

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

我正在使用 Slick 3.1.1,我想在 Slick 事务上实现我自己的东西。

def findSomeProducts = table.getSomeProducts() //db operation
def productTableUpdate = doSomeStuff1() //db operation
def priceTableUpdate = doSomeStuff2() //db operation

def updateElasticCache = updateIndexOfProduct() //this is not a database operation

我有这些示例函数。首先,我从 db 获取一些产品,然后更新表格。最后我需要运行 updateElasticCache 方法。如果 updateElasticCache 方法失败,我想回滚整个数据库过程。

我不能用 (for { ... } yield ()).transactionally这段代码因为它不适用于我的情况。这个“事务性”正在等待数据库操作。但我想添加另一个不是数据库进程的功能。

是否可以?我怎样才能实现它?

最佳答案

DBIO.from

是的 !!!可以使用 DBIO 操作组合和 DBIO.from 在 db 逻辑之间添加非 db 逻辑。

请注意,“你自己的东西”应该返回一个 future , future 可以转换为 DBIO 并且可以与通常的 db 操作一起组合。
DBIO.from可以帮您解决这个问题。下面是它的工作原理。 DBIO.from接受 future 并将其转换为 DBIOAction。现在您可以将这些操作与通常的 db 操作组合在一起,以在事务中执行非 db 操作和 db 操作。

def updateElasticCache: Future[Unit] = Future(doSomething())

现在让我们说我们有一些数据库操作
def createUser(user: User): DBIO[Int] = ???

如果更新缓存失败,我希望 createUser 回滚。所以我做以下
val action = createUser.flatMap { _ => DBIO.from(updateElasticCache()) }.transactionally
db.run(action)

现在如果 updateElasticCache整个失败 tx将失败,一切都将回滚到正常状态。

示例

您可以用于理解以使其看起来不错
def updateStats: DBIO[Int] = ???
val rollbackActions =
(for {
cStatus <- createUser()
uStatus <- updateStats()
result <- DBIO.from(updateElasticCache())
} yield result).transactionally
db.run(rollbackActions)

如果 updateElasticCache,一切都会回滚 future 失败

关于scala - 在 Slick 交易中做自己的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298581/

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