Slick 3 Transactions检查失败多个动作

时间:2015-10-28 20:09:10

标签: database scala transactions slick typesafe

我对Slick 3 Transactions

有疑问

我想运行一系列删除行,并检查每次删除是否成功。如果有任何失败,我想回滚整个交易

这是一些伪Slick代码:

val action = DBIO.seq(
  TableQuery[X].filter(_.x===a).delete,
  TableQuery[Y].filter(_.y===b).delete,
  TableQuery[Z].filter(_.z===c).delete
).transactionally

database.run(action)

在这种情况下,每个删除都应删除现有行。如果实际上没有找到要删除的行,我希望整个事务回滚。

在Slick中执行此操作的成语是什么?

提前致谢 彼得

1 个答案:

答案 0 :(得分:0)

我找到了一个适合我的解决方案。将它发布给那些追随的人。

据我所知,当WHERE子句不匹配行时,SQL似乎没有办法让DELETE WHERE失败。但是,可以通过表约束使INSERT创建重复行失败。

因此,我不是只删除行,而是在表格中添加一个“已删除”列。删除看起来像这样

api/android/v1

和(重新)INSERTing看起来像这样

DELETE where ... and Deleted=0
INSERT ..., Deleted=1

现在,如果2个进程尝试删除同一行,则第一个DELETE将同时成功,但INSERT将失败,其中一个为“重复行”。此异常将导致事务回滚。