首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >精明的3笔交易

精明的3笔交易
EN

Stack Overflow用户
提问于 2015-05-19 21:49:26
回答 2查看 12.2K关注 0票数 15

我被slick 3文档描述事务的方式弄糊涂了。我有像这样的slick 2代码:

代码语言:javascript
复制
def doSomething(???) = DB.withTransaction { implicit session => 
    userDao.doSomething(???)
    addressDao.doSomething(???)
    contactDao.doSomething(???)
}

如何在slick 3中跨越一个事务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-19 22:12:08

请查看此处的文档http://slick.typesafe.com/doc/3.0.0/dbio.html#transactions-and-pinned-sessions

其思想是将一系列IO操作包装到一个transactionally中,如下例所示:

代码语言:javascript
复制
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仍然可以反应性地处理所有操作,但它会在一个事务中按顺序运行所有操作。

因此,您的示例将如下所示:

代码语言:javascript
复制
def doSomething(???) = (for {
  _ <- userDao.doSomething(???)
  _ <- addressDao.doSomething(???)
  _ <- contactDao.doSomething(???)
} yield()).transactionally
票数 17
EN

Stack Overflow用户

发布于 2015-05-20 04:46:14

代码语言:javascript
复制
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会话,在这里它都有可能重用相同的会话。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30327617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档