我被slick 3文档描述事务的方式弄糊涂了。我有像这样的slick 2代码:
def doSomething(???) = DB.withTransaction { implicit session =>
userDao.doSomething(???)
addressDao.doSomething(???)
contactDao.doSomething(???)
}如何在slick 3中跨越一个事务?
发布于 2015-05-19 22:12:08
请查看此处的文档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)通过这种方式,Slick仍然可以反应性地处理所有操作,但它会在一个事务中按顺序运行所有操作。
因此,您的示例将如下所示:
def doSomething(???) = (for {
_ <- userDao.doSomething(???)
_ <- addressDao.doSomething(???)
_ <- contactDao.doSomething(???)
} yield()).transactionally发布于 2015-05-20 04:46:14
val dbAction = (
for {
user <- userTable.doSomething
address <- addressTable.doSomething
contact <- contactTable.doSomething
} yield()
).transactionally
val resultFuture = db run dbAction你只需要把你的动作包装成“事务性的”。Slick将负责将所有打包的DB操作作为一个事务来运行。
除了具有更多响应式/函数式/异步方式的编写代码的标准优势外,它还允许对性能进行改进。例如,它可以在运行时确定多个操作是否可以使用同一会话。在Slick 2.0中,无论何时使用'withTransaction‘或'withSession’打开一个新的jdbc会话,在这里它都有可能重用相同的会话。
https://stackoverflow.com/questions/30327617
复制相似问题