我对Slick 3和交易
有疑问我已阅读文档
http://slick.typesafe.com/doc/3.1.0/dbio.html
和其他Slick 3交易问题
Executing non-database actions in a transaction in Slick 3
但他们没有帮助我
我需要从数据库中读取一些值,在Scala中运行一些逻辑,然后根据结果修改数据库。我希望整个操作都是原子的。
我的代码看起来像这样:
database.run(TableQuery[X].filter(blah).result).map { x =>
database.run {
if( someLogicNotInSQL(x) )
TableQuery[Y].insert(someFoo)
else
TableQuery[Y].insert(someBah)
}
}
如何获取查询的值,在Scala中运行一些逻辑,然后将另一个操作(例如insert)全部作为一个原子事务运行。
由于 彼得
答案 0 :(得分:5)
要在事务中运行此操作,您需要构建包含查询和逻辑的单个操作。然后使用事务运行该操作。
修改您的示例:
import scala.concurrent.ExecutionContext.Implicits.global
val action =
tableQuery.filter(blah).result.flatMap { x =>
if (someLogicNotInSql(x))
tableQuery.insert(someFoo)
else
tableQuery.insert(someBah)
}
flatMap
需要一个从x
到DBIO[T]
的函数作为参数。它将两个动作排在一起,允许第二个动作使用第一个动作的结果。
要运行此组合操作,您需要执行上下文。 (因为你的计算if (someLogicNotInSql ...
必须在某个线程上运行,而不是Slick的内部执行上下文。)
您可以将此合并操作包装在一个事务中,只需调用run
一次:
val future = database.run(action.transactionally)