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失败,那么我的数据处于错误状态.
我怎么解决这个问题?
除非一切都在事务中执行,否则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)