数据库某张表做增加功能要进行编号,怎样避免两个人同时取得一样的最大id?

发布于 2021-12-04 11:28:00 字数 17 浏览 720 评论 13

或者除了取最大id还有其他办法吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

皇甫轩 2021-12-04 15:53:48

项目表中维护'任务总数'字段

霞映澄塘 2021-12-04 15:53:48

嗯你这种方法应该跟上面有个哥们说的"sum锁"的性质一样吧,我这就去尝试下

夜血缘 2021-12-04 15:53:44

我建议不要用number型的id字段来区分任务表的任务,将当前用户id+插入时间+...(其他可以区分的条件)插入进任务表来进行区分,一般我是这样做的。

夜无邪 2021-12-04 15:53:41

既然是多对一的关系、你的任务表的id保存新的时没必要使用自增加最大吧?

谁的新欢旧爱 2021-12-04 15:53:41

我这里说的不太准确,应该不是“最大id”,应该是“属于某个项目下的所有任务对象的集合的长度”,但是意思应该差不多吧。我这里就在犹豫万一两个用户同时增加,取得的数字一样怎么办

只为守护你 2021-12-04 15:53:29

咦,这样,是不是我增加时候先查出这个项目对应的sum字段的值,然后进行你那条sql的执行?

醉生梦死 2021-12-04 15:53:16

回复
是的,这样就能避免并发的情况出现。比如两个线程同时查出了 sum=9,那么更新的时候把sum=9的条件加上,按照一般的数据库隔离机制,必然会导致两条update只能有一条更新成功

泛泛之交 2021-12-04 15:52:08

回复
不过可以考虑用一下redis 计数器,快,而且简单

猫性小仙女 2021-12-04 15:49:10

非常感谢!我能明白意思了,我这就去尝试一下,那个redis计数器抱歉我还是个小白,没接触过耶?理解起来的话难度大吗?

倚栏听风 2021-12-04 15:26:58

回复
你安装一个redis,然后用任何一种java的客户端,上面应该有一个incr的方法,这个方法简单的说就是不断的自增长,并且返回一个整数。并且是自带事物的,也就是说不会有重复的问题。那么你就可以把sum的这个字段,变为redis中的一个key。如果你的项目很多,而任务很少,不建议这样做,反而麻烦。

岁吢 2021-12-04 15:06:26

大致明白了你的意思,这个字段并不是主键,而是某一个父id下的子id,并且这个子id也是需要自增长的,我觉得可以加个锁,比如在parent上增加一个sum字段,如果增加任务的时候,先更新sum,类似于 update sum=sum+1 where sum=sum 如果成功,就新增一条,如果不成功,就说明有并发问题,顺延一个数字,这个地方也可以用redis 计数器。

本宫微胖 2021-12-04 14:14:23

目前是这样的。其实这张表并没那么简单,它是任务表,有字段prjId,对应的项目表的id,任务跟项目是多对一的关系。我增加某个任务,先要查出这个项目下边有多少个任务,再进行这个项目的任务编号,除了取得这个项目下边的任务的总个数,还有其他办法吗

秉烛思 2021-12-04 13:25:38

id必须按照自增顺序吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文