首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slick 3事务检查故障多个操作

Slick 3事务检查故障多个操作
EN

Stack Overflow用户
提问于 2015-10-29 04:09:10
回答 1查看 472关注 0票数 0

我有一个关于Slick 3交易的问题

我想运行一系列delete行,并检查每个delete是否成功。如果失败,我想回滚整个事务

下面是一些伪巧妙的代码:

代码语言:javascript
复制
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中做这件事的习惯用法是什么?

提前谢谢,彼得

EN

回答 1

Stack Overflow用户

发布于 2015-10-30 21:29:29

我找到了一个适合我的解决方案。把它贴在这里,给后面的人看。

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

因此,我在表中添加了一个额外的“DELETEing”列,而不是只删除行。删除操作如下所示

代码语言:javascript
复制
DELETE where ... and Deleted=0
INSERT ..., Deleted=1

和(re)INSERTing看起来像这样

代码语言:javascript
复制
DELETE where ... and Deleted=1
INSERT ..., Deleted=0

现在,如果两个进程试图删除相同的行,第一次删除都会成功,但其中一个进程的插入将失败,并显示"duplicate row“。此异常将导致事务回滚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33400680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档