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

Bla*_*man 1 postgresql scala transactions slick

我有我的DAO代码,看起来像:

UserDao.scala:

def save(user: User)(implicit session: Session) ... {
   ....
}
Run Code Online (Sandbox Code Playgroud)

然后UserService:

def save(user: User) .. {
  db.withSession { implicit session =>
      userDao.save(user)
   }
}
Run Code Online (Sandbox Code Playgroud)

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

现在我的问题是,现在我想围绕多个呼叫创建一个事务,这可能吗?

OtherService:

   userService.save(user)
   accountService.save(account)
Run Code Online (Sandbox Code Playgroud)

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

我怎么解决这个问题?

Mic*_*jac 7

除非一切都在事务中执行,否则Slick的withTransaction工作方式完全相同withSession.

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

def save(user: User)(implicit: Session) {
    userDao.save(user)
}
Run Code Online (Sandbox Code Playgroud)

然后提供Session通过withTransaction:

db.withTransaction{ implicit session =>
     userService.save(user)
     accountService.save(account)
}
Run Code Online (Sandbox Code Playgroud)