gpt4 book ai didi

php - 为商店订单生成唯一的序列号

转载 作者:搜寻专家 更新时间:2023-10-31 21:04:09 24 4
gpt4 key购买 nike

我们使用 symfony2 构建了一个商店系统,使用必须生成唯一序列号的原则。有一个 Order 实体,它最初有一个属性 orderNumberOrder 实体是我们的“购物 session ”,因此不仅提交的订单会持久保存,而且每次用户放置某物时都会保存。进他的购物车。 orderNumber 默认为 null,仅应在用户提交订单时设置。在普通的 MySQL 中,我会做某事。像这样:

INSERT INTO orders (orderNumber, [...])
SELECT MAX(orderNumber) + 1, [...] FROM orders;

但要在原则上实现这一点,我必须执行一个表写锁,选择最大 orderNumber,将其设置为订单实体,持久化,然后解锁表。我不想那样做(表锁定的原因),所以快速的解决方法是取消 orderNumber 属性,只将 id 显示为订单号。但这不是一个很好的解决方案,订单号有差距并且越来越高(4 个月后我们有一个 140k 的自动增量值并且订单号不应超过 6 个字符,所以我们需要在遇到这个问题之前解决方案限制)。

创建一个映射的父类(super class)并将订单实体拆分为单独的实体和临时订单和已提交订单的表会导致过多的代码更改。所以下一个想法是创建一个单独的带有自动递增字段的 OrderNumber 实体,并在用户提交订单时将其设置为 Order 实体。这似乎是一种无需太多更改即可实现的方法。

但也许有更好的方法来解决这个问题,从原则上来说最好的解决方案是什么?

最佳答案

当订单号使用自动递增时,它被认为是电子商务中的一个缺点。原因是您的竞争对手可以轻松跟踪这些数字,并且或多或少知道您在一段时间内有多少订单。他们可以利用这些知识为自己谋利。这就是我们公司要求生成随机订单号的原因。我们通过“打乱”从自动增量中检索到的 ID 来生成一个包含数字和字母的 6 字符标识符(当您使用字母时,您可以轻松地将超过一百万的订单放入 6 个字符,支付网关应该可以使用字母)。这是以一种确定性的方式完成的,所以这个数字可以转换回 ID(尽管这不是绝对必要的)。

您的解决方案带有一个单独的订单号表,对我来说似乎很不错。您还可以对 orderNumber 进行唯一约束并生成随机数或随机数的哈希值(种子应反射(reflect)实际时间和用户 session ID,以限制冲突的可能性)并尝试更新实体。如果失败,您将尝试重新生成。然后,您应该设置失败的最大次数,这样如果出现不同的问题,它就不会永远循环。

关于php - 为商店订单生成唯一的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com