我有一个关于Slick 3交易的问题
我想运行一系列delete行,并检查每个delete是否成功。如果失败,我想回滚整个事务
下面是一些伪巧妙的代码:
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中做这件事的习惯用法是什么?
提前谢谢,彼得
发布于 2015-10-30 21:29:29
我找到了一个适合我的解决方案。把它贴在这里,给后面的人看。
据我所知,在SQL中,当WHERE子句没有匹配任何行时,似乎没有办法让DELETE WHERE失败。但是,通过表约束,可以使创建重复行的INSERT失败。
因此,我在表中添加了一个额外的“DELETEing”列,而不是只删除行。删除操作如下所示
DELETE where ... and Deleted=0
INSERT ..., Deleted=1和(re)INSERTing看起来像这样
DELETE where ... and Deleted=1
INSERT ..., Deleted=0现在,如果两个进程试图删除相同的行,第一次删除都会成功,但其中一个进程的插入将失败,并显示"duplicate row“。此异常将导致事务回滚。
https://stackoverflow.com/questions/33400680
复制相似问题