我对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中执行此操作的成语是什么?
提前致谢 彼得
答案 0 :(得分:0)
我找到了一个适合我的解决方案。将它发布给那些追随的人。
据我所知,当WHERE子句不匹配行时,SQL似乎没有办法让DELETE WHERE失败。但是,可以通过表约束使INSERT创建重复行失败。
因此,我不是只删除行,而是在表格中添加一个“已删除”列。删除看起来像这样
api/android/v1
和(重新)INSERTing看起来像这样
DELETE where ... and Deleted=0
INSERT ..., Deleted=1
现在,如果2个进程尝试删除同一行,则第一个DELETE将同时成功,但INSERT将失败,其中一个为“重复行”。此异常将导致事务回滚。