与Slick 3.0在同一事务中多次插入

时间:2015-07-07 10:31:02

标签: playframework slick play-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))
}

我如何在光滑3中做到这一点?我希望在一个事务中插入所有对象。如果无法插入一个对象,则不应插入任何对象。

2 个答案:

答案 0 :(得分:1)

根据documentation,您可以在db-action上使用document.ready

.transactionally

为您提供的代码提供以下示例:

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)

答案 1 :(得分: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

在原始用例中,您只需构造操作即可。