我可以使用光滑包装会话来创建事务吗?

时间:2014-06-22 22:17:34

标签: postgresql scala transactions slick

我的DAO代码如下:

UserDao.scala:

def save(user: User)(implicit session: Session) ... {
   ....
}

然后是UserService:

def save(user: User) .. {
  db.withSession { implicit session =>
      userDao.save(user)
   }
}

我有其他ABCService类,与我的其他模型具有完全相同的模式。

现在我的问题是,现在我想围绕多个电话创建一个交易,这可能吗?

OtherService:

   userService.save(user)
   accountService.save(account)

现在,如果其中一个调用失败,我希望它回滚。问题是当前每个Service类中的会话都是独立处理的,所以如果userService.save(user)通过但是accountService.save失败,那么我的数据处于错误状态。

如何解决此问题?

2 个答案:

答案 0 :(得分:7)

Slick的withTransactionwithSession完全相同,只是一切都在事务中执行。

要求服务功能的签名具有implicit: Session参数(如果要在事务中使用),并从中删除配置的Session

def save(user: User)(implicit: Session) {
    userDao.save(user)
}

然后通过Session提供withTransaction

db.withTransaction{ implicit session =>
     userService.save(user)
     accountService.save(account)
}

答案 1 :(得分:0)

也许您可以查看https://github.com/tim-group/scalaquery_nested

他们的实现看起来非常简洁:https://github.com/tim-group/scalaquery_nested/blob/master/src/main/scala/com/timgroup/scalaquery_nested/NestedScalaQuerySessionsAndTransactions.scala

但是他们使用异常来检测包装会话,不确定它是否存在复杂会话/事务嵌套的性能问题。