【问题标题】:MySQL get next unique value without auto incrementMySQL在没有自动增量的情况下获得下一个唯一值
【发布时间】:2012-06-09 05:20:05
【问题描述】:

我正在开发一个 MySQL 数据库 (InnoDB),用于在我的组织中跟踪工单。有多个“站点”,每个站点的工单编号从 100 开始。

WorkorderID    SiteID    SiteWorkorderNum
     1           1            100
     2           1            101
     3           2            100

WorkorderID 是自动递增字段。
SiteIDSiteWorkorderNum 都设置为唯一约束。

每当要为特定站点插入新工作订单时,应用程序都会检查登录者的 siteid 的 max(SiteWorkorderNum),并将该值返回到插入语句。我要避免的问题是,如果同一站点的两个用户都同时输入新的工作订单。

我有几个可能的解决方案,但我想看看是否有更好的方法,因为每个都有它的缺点,但我确信其中一个会比另一个更好,当然我对新想法持开放态度.

1) 锁定表以保证在我们检索并插入我们的值之前没有其他用户检索 SiteWorkorderNum 值(但是假设我们每分钟都有成千上万的用户尝试输入工作订单,表锁不会减慢速度吗?)

2) 不要锁定表,并检索下一个可用的 SiteWorkorderNum 并尝试插入到数据库中,如果我收到唯一约束错误,则捕获错误并重试,直到我'米成功。 (这可能会释放表,但再次假设我们在同一个站点有数千个用户,多个数据库调用会不会有点低效?)

我对这些解决方案中的任何一个如何“可能”影响性能是否过于偏执?当然,我没有成千上万的用户,但我想在这个设计中应用最佳实践,以防我曾经从事过流量很大的项目。

【问题讨论】:

    标签: mysql unique-constraint table-locking


    【解决方案1】:

    一种选择是使用事务。如果您将SELECT MAX(SiteWorkorderNum) ... WHERE SiteID=... 与生成的插入一起执行,那么一切都应该工作。唯一的问题是您的交易可能会失败,这可能对用户体验不利。

    我之前使用的另一种方案是有一个包含SiteIdNextWorkorderNum 列的分配表。只需执行UPDATE SiteWorkorderAlloc SET @Num=NextWorkorderNum, NextWorkorderNum=NextWorkorderNum+1 WHERE SiteId=...。然后抓住@Num 在后续插入中用作您的工作订单号。它工作正常,唯一的小缺点是如果在获取工作订单号和插入之间发生崩溃,则该工作订单号会丢失(从未使用过)。

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2010-10-26
      相关资源
      最近更新 更多