我从数据库中批量删除项目,但我想将其作为事务进行。在这种情况下,我想要全有或全无的操作,它要么删除所有项目并返回成功的响应,要么在一个或多个项目不正确(数据库中不存在的项目等)时返回错误。首先,我想简单检查数据库中对象的存在,如果它们都存在,我想执行删除操作或抛出异常。
不幸的是,根据 Stack Overflow 上的文档和回复,我无法让事情正常工作。
我的操作如下所示:
def delete(siteIds: Long*): Future[Int] = {
val filtered = sites.filter(_.id inSet siteIds)
val action = (for {
l <- filtered.length.result
d <- l match {
case c if c == siteIds.size => filtered.delete
case _ => DBIO.failed(new InvalidEntityException)
}
} yield d) transactionally
DB.run(action)
}
我也试过:
def delete(siteIds: Long*): Future[Int] = {
val filtered = sites.filter(_.id inSet siteIds)
val action = filtered.length.result.flatMap(l =>
if (l == siteIds.size) {
filtered.delete
} else {
DBIO.failed(new InvalidEntityException)
}
) transactionally
DB.run(action)
}
出于某种原因,@DBIO.failure@ 破坏了正确的响应。当我运行该代码时,如果数据不正确,则会引发异常,但如果数据正确,我会收到一个错误,提示某些内容(结果?)为空。
[error] null (Site.scala:174)
[error] models.SiteDao$$anonfun$22.apply(Site.scala:174)
[error] models.SiteDao$$anonfun$22.apply(Site.scala:171)
[error] slick.backend.DatabaseComponent$DatabaseDef$$anonfun$runInContext$1.apply(DatabaseComponent.scala:146)
[error] slick.backend.DatabaseComponent$DatabaseDef$$anonfun$runInContext$1.apply(DatabaseComponent.scala:146)
如何使其正常工作?