【发布时间】:2019-08-15 07:38:32
【问题描述】:
我已经经历了Spring CRUD repository: is there findOneByMaxXYZColumn()? 和Spring data jpa. Find max if no result return default value,但我更多的是从并发环境中的正确实现角度来看。
在我的Employee 表应用程序中,ETL 和 NiFi 等工具会将 Employee 添加到 Postgres 数据库中,但在插入 PK ID 序列时不会维护它可能是任何唯一值。
例如:Employees 的任何值,例如 399、430、439、444 等。如果我们查看,400 到 429 之间的 ID 没有被占用,但是当我通过管理 UI 添加 Employee 时,在这种情况下它应该始终为 445。我正在使用 Spring Boot JPA 存储库查询
Long findFirstByEmployeeIdAsc();
这样我将获得 Max Id (员工表的 PK 列中存在的最大值),在将记录保存到数据库时,我将对 ID 做 +1。这是使用并发环境的正确方法吗?
有没有什么方法可以在 Jpa Repository 查询的帮助下得到 MAXID+1 的值?如果我们使用它,如果发生任何异常,该 Id 会被消耗掉吗?
任何指针?
【问题讨论】:
-
我没有仔细阅读您的问题。对于那个很抱歉。 1.您不应该仅仅为了获得最大值而阅读整个实体。 2. 您必须准备好从数据库中获取重复键错误。然后你可以一次又一次地尝试。另一种选择是锁定表。但是你阻止并发用户
-
@SimonMartinelli - 谢谢。 Re 1.您不应该仅仅为了获得最大值而阅读整个实体。根据
Long findFirstByEmployeeIdAsc();,我只是从 DB 获得 Max PK Id。实现上述所有场景的最佳方法是什么?我以某种方式从 DB 获得 MAX+1,然后消耗 PK ID,并发用户将获得新的 PK ID。唯一需要担心的是,当保存时发生预期时,我需要回滚该 ID .. 对吗? -
不,你需要一个新的
-
对不起,我还不清楚。我想我应该从数据库中获取 Max Id 并在保存存储库时手动执行 Max PK Id + 1
-
是的。然后你做一个保存。此保存可能会失败,然后您必须再次执行此操作设置 id 并再次保存