我正在使用光滑的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中做到这一点?我希望在一个事务中插入所有对象。如果无法插入一个对象,则不应插入任何对象。
答案 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
在原始用例中,您只需构造操作即可。