【问题标题】:Preventing duplicate data with locking or transactions?通过锁定或事务防止重复数据?
【发布时间】:2013-06-04 20:11:46
【问题描述】:

在我们的应用程序中,当用户创建订单时,我们会得到下一个订单,如下所示:

SELECT MAX(CAST(REPLACE(orderNum, 'SO', '') AS SIGNED)) + 1 FROM orders

问题在于,由于客户越来越忙,我们开始看到在完全相同的时间创建的订单会导致重复的订单 #。

处理此问题的最佳方法是什么?我们应该锁定整个订单表还是只锁定行?还是我们应该做交易?

【问题讨论】:

  • 为什么不让 MySQL 通过将订单设为auto_incrementing 主键来为您生成订单号?
  • 使用 max() 生成下一个 id 从一开始就有缺陷,当您有并发事务时会不正确或无法扩展。使用 DBMS 的内置功能生成数字。

标签: mysql locking innodb


【解决方案1】:

您可以创建一个额外的表,其中只有一个具有 auto_increment 属性的字段。 现在,每次您需要一个新的订单号时,您都会调用一个函数,该函数将在此表中创建一个字段并返回 last_insert_id() 的结果,然后您可以将其用作订单号(只需确保设置表高于您的最大订单号)。

【讨论】:

  • 订单号与订单表中的主键是分开的。所以你可以 orderID=1, orderID=2 但他们都可以有相同的订单 # - 这就是问题所在。我想避免为此添加表格。
  • @drschultz 还有其他方法可以做到这一点,但它们都涉及锁定和您要求避免的各种事务。使用 auto_increment 在表中插入一行是我所知道的唯一可以避免摆弄这些类型的东西的原子指令。是否需要额外的表取决于您的数据库布局,我们对此一无所知。
猜你喜欢
  • 2015-10-11
  • 2016-12-13
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多