mysql 使续编增量值唯一

c90pui9n  于 2023-08-02  发布在  Mysql
关注(0)|答案(2)|浏览(93)

我目前正在使用Sequelize中的increment()函数递增一列的订单号值。即:.increment("order_no", { by: 1 });
偶尔一个请求会在同一秒到达我的API,我最终会得到一个重复的订单号值。
有什么方法可以保证订单号的增量值是唯一的吗?我需要将increment Package 在事务中吗?我是否应该在创建数字值后进行随机定时检查,以查看是否存在重复?我不确定解决这个问题的正确方法。
来自Sequelizes文档(https://sequelize.org/docs/v6/core-concepts/model-instances/#incrementing-and-decrementing-integer-values)
为了在不遇到并发问题的情况下递增/递减示例的值,Sequelize提供了递增和递减示例方法。
然而,虽然这似乎是工作,我仍然得到重复的值时,被利用。

pvabu6sv

pvabu6sv1#

我认为你可以尝试捕捉错误,如果重复的订单ID发生,并重试操作,并生成一个新的订单ID。

91zkwejq

91zkwejq2#

如果我理解正确的话,您有一个orders模型/表来跟踪订单。每个命中API的newOrder请求都会要求sequelize(Order模型)手动递增order_no列。如果两个这样的请求同时命中API,它们会将相同的值插入orders表两次。
因此,您希望向这个'order_num'列添加“unique key”限制,但这不是唯一标识订单的有效方法。无论使用increment...by还是increment/decrement函数,sequelize最终都会使用相同的值查询数据库。
在我看来,你不应该这么做。
相反,添加一个order_no列,自动递增'order_no'列。Sequelize支持所有方言的自动增量功能。看看这篇文章:Auto increment id with sequelize in MySQL的数据。
要唯一标识“订单”,请为每个传入订单生成一个随机的唯一ID。这比试图有唯一的积分“order_no”要好。退房:https://dev.to/gulshanaggarwal/npm-packages-to-generate-unique-ids-for-your-next-project-1p3b
有了唯一的“order_id“,你甚至不需要order_no自动增量列。
要统计某一天的订单数量,可以合并Sequelize的模型查询方法,如基于createdAt时间戳的findAndCountAll加上where子句。
你可以做其他你需要的任务,如排序,计算订单数量,查找最新或最早的订单等。
这些都在续集文档网站上有很好的记录。
考虑一下,重新设计您的模式以提高效率。
如果这没有帮助,您可以通过共享“模型示例”代码和API中的增量代码来帮助我们帮助您。

相关问题