数据库某张表做增加功能要进行编号,怎样避免两个人同时取得一样的最大id?
或者除了取最大id还有其他办法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
或者除了取最大id还有其他办法吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(13)
项目表中维护'任务总数'字段
嗯你这种方法应该跟上面有个哥们说的"sum锁"的性质一样吧,我这就去尝试下
我建议不要用number型的id字段来区分任务表的任务,将当前用户id+插入时间+...(其他可以区分的条件)插入进任务表来进行区分,一般我是这样做的。
既然是多对一的关系、你的任务表的id保存新的时没必要使用自增加最大吧?
我这里说的不太准确,应该不是“最大id”,应该是“属于某个项目下的所有任务对象的集合的长度”,但是意思应该差不多吧。我这里就在犹豫万一两个用户同时增加,取得的数字一样怎么办
咦,这样,是不是我增加时候先查出这个项目对应的sum字段的值,然后进行你那条sql的执行?
回复
是的,这样就能避免并发的情况出现。比如两个线程同时查出了 sum=9,那么更新的时候把sum=9的条件加上,按照一般的数据库隔离机制,必然会导致两条update只能有一条更新成功
回复
不过可以考虑用一下redis 计数器,快,而且简单
非常感谢!我能明白意思了,我这就去尝试一下,那个redis计数器抱歉我还是个小白,没接触过耶?理解起来的话难度大吗?
回复
你安装一个redis,然后用任何一种java的客户端,上面应该有一个incr的方法,这个方法简单的说就是不断的自增长,并且返回一个整数。并且是自带事物的,也就是说不会有重复的问题。那么你就可以把sum的这个字段,变为redis中的一个key。如果你的项目很多,而任务很少,不建议这样做,反而麻烦。
大致明白了你的意思,这个字段并不是主键,而是某一个父id下的子id,并且这个子id也是需要自增长的,我觉得可以加个锁,比如在parent上增加一个sum字段,如果增加任务的时候,先更新sum,类似于 update sum=sum+1 where sum=sum 如果成功,就新增一条,如果不成功,就说明有并发问题,顺延一个数字,这个地方也可以用redis 计数器。
目前是这样的。其实这张表并没那么简单,它是任务表,有字段prjId,对应的项目表的id,任务跟项目是多对一的关系。我增加某个任务,先要查出这个项目下边有多少个任务,再进行这个项目的任务编号,除了取得这个项目下边的任务的总个数,还有其他办法吗
id必须按照自增顺序吗?