1

我正在使用 slick 2.1.0 将我的 Play Framework 应用程序升级到 play-slick 1.0.0(其中包括 slick 3.0.0)。

我在理解如何处理事务时遇到了一些问题。

可以说我有以下代码:

db.withTransaction { implicit session =>
    for (id <- ids) yield someTable.insert(SomeObject(id))
}

我如何在 slick 3 中做到这一点?我希望将所有对象插入一个事务中。如果一个对象插入失败,则不应插入任何对象。

4

2 回答 2

1

根据文档,您可以.transactionally在 db-action 上使用:

val a = (for {
  ns <- coffees.filter(_.name.startsWith("ESPRESSO")).map(_.name).result
  _ <- DBIO.seq(ns.map(n => coffees.filter(_.name === n).delete): _*)
} yield ()).transactionally

val f: Future[Unit] = db.run(a)

对于您提供的代码,这会产生以下示例:

val a = (for (id <- ids){
   someTable.insert(SomeObject(id))
} yield ()).transactionally

val f: Future[Unit] = db.run(a)
于 2015-07-07T10:53:26.003 回答
0

我有一个稍微不同的场景,我必须在同一个事务中更新两个表,下面的代码似乎是实现这一点的最优雅的方式:

val c: DBIOAction[(Int, Int), NoStream, Effect.Write with Effect.Write] = for{
      i1 <- (tbl1 += record1)
      i2 <- (tbl2 += record2)
    } yield {
      (i1,i2)
    }
val f = db run c.transactionally

看着这个,我觉得这很像 scala Future 的 api,所以肯定有一个序列方法,而且确实有一个:

val actions = Seq((tbl1 += record1), (tbl2 += record2))
val dbActions: DBIOAction[Seq[Int], NoStream, Effect.Write with Effect.Transactional]
    =  DBIOAction.sequence(actions).transactionally
val f = db run dbActions

在原始用例中,您可以根据自己的理解简单地构建操作。

于 2018-03-28T09:23:37.933 回答