在Java中为多实例应用生成自动增量id (int)



我有一个存储用户信息(id、姓名、姓氏、地址、电子邮件等)的表。我不想使用数据库的自动增量功能。所以,我们不想创建序列。我想在spring引导应用程序中生成id,并插入我自定义的人类可读id(例如1,2,3,…N)在创建新用户时将数据库删除。为了做到这一点,我总是希望选择max id并将其增加1,并插入作为新记录的id。例如,用户表中的max id为5,我将获取max并增加它,新用户id将为6。如果只有一个实例,不会有任何问题,但如果有超过一个实例的spring引导应用程序,理论上可能会有问题。如果两个实例都取max id并增加它,它们将得到相同的结果,其中一个会因为唯一键约束而得到异常。

我有一些解决方案,但我认为有更好的解决方案。我的解决方案
  1. 始终在redis中存储max键,并且在取max时立即增加它。
  2. 锁表(坏的解决方案)
  3. 如果我可以复制约束异常,我会再次检查max,检查id大于新用户id,然后再次增加并插入它。

然而,我认为它们不是最好的解决方案。最后,我只想在应用程序级别增加id,我不想使用db的序列。我的问题是,如果我有超过1个实例,可能会有问题。那么我该如何解决这个问题呢?

在postgresql中有一个函数叫做nexVal(seqId)。它用于保留一个其他人不能使用的id。这可能是解决你问题的一种方法

最新更新