【发布时间】:2020-06-20 13:10:03
【问题描述】:
当实现一个创建需要一些工作人员解决的任务的系统时,我的想法是创建一个表,该表将具有一些任务定义和状态,例如对于文档审查,我们会有类似reviewId, documentId, reviewerId, reviewTime 的内容。
当文档上传到系统时,我们只需将documentId 与生成的reviewId 一起存储,并将reviewerId 和reviewTime 留空。当下一个审阅者出现并开始审阅时,我们只需设置他的 id 和当前时间以将工作标记为“进行中”(我故意跳过审阅者花费很长时间或在审阅期间死亡的情况)。
在例如实现这样的用例时PostgreSQL 我们可以使用UPDATE review SET reviewerId = :reviewerId, reviewTime: reviewTime WHERE reviewId = (SELECT reviewId from review WHERE reviewId is null AND reviewTime is null FOR UPDATE SKIP LOCKED LIMIT 1) RETURNING reviewId, documentId, reviewerId, reviewTime(所以基本上更新第一个未采用的行,使用SKIP LOCKED 跳过任何已经在处理中的行)。
但是当从原生解决方案迁移到 JDBC 及其他解决方案时,我在实现这一点时遇到了麻烦:
- Spring Data JPA 和 Spring Data JDBC 不允许
@Modifying查询返回除void/boolean/int以外的任何内容,并强制我们在单个事务中执行 2 个查询 - 一个用于第一个待处理行,第二个有更新 - 另一种选择是使用存储过程,但我真的很讨厌将此类逻辑存储在远离代码的地方
- 其他替代方法是使用持久队列并一直跳过数据库,但这引入了需要维护和学习的额外基础架构组件。欢迎提出任何建议。
我错过了什么吗?是否有可能拥有这一切,还是我们必须满足于多个查询或存储过程?
【问题讨论】:
-
不喜欢问题的人能写出原因吗?
标签: postgresql spring-data-jpa spring-data queue spring-data-jdbc