我对这个光滑的3文档描述交易的方式感到困惑.我有两个看起来像这样的代码:
def doSomething(???) = DB.withTransaction { implicit session =>
userDao.doSomething(???)
addressDao.doSomething(???)
contactDao.doSomething(???)
}
Run Code Online (Sandbox Code Playgroud)
如何在光滑3中跨越交易?
Gre*_*man 17
请查看http://slick.typesafe.com/doc/3.0.0/dbio.html#transactions-and-pinned-sessions中的文档.
我们的想法是将一系列IO操作包装成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)
Run Code Online (Sandbox Code Playgroud)
这样Slick仍然可以反应性地处理所有操作,但它会在一个事务中按顺序运行它们.
所以你的例子看起来像这样:
def doSomething(???) = (for {
_ <- userDao.doSomething(???)
_ <- addressDao.doSomething(???)
_ <- contactDao.doSomething(???)
} yield()).transactionally
Run Code Online (Sandbox Code Playgroud)
pan*_*her 14
val dbAction = (
for {
user <- userTable.doSomething
address <- addressTable.doSomething
contact <- contactTable.doSomething
} yield()
).transactionally
val resultFuture = db run dbAction
Run Code Online (Sandbox Code Playgroud)
您只需要将您的操作包装成"事务性".Slick将负责将所有包装的数据库操作作为事务运行.
除了具有更加反应/功能/异步编写代码的方式的标准优势之外,它还允许几个性能改进.就像它可以在运行时确定多个动作是否可以使用相同的会话.在Slick 2.0中,每当你使用'withTransaction'或'withSession'打开一个新的jdbc会话时,它就有可能重用它.
归档时间: |
|
查看次数: |
10263 次 |
最近记录: |