2012-06-09 47 views
0

下一个独特的价值我有我开发我的组织跟踪工作订单的MySQL数据库(InnoDB的)。有多个“点”,并且每个站点都有工单号为100。MySQL的获得不带自动增量

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

开始WorkorderID是自动递增领域。
SITEIDSiteWorkorderNum都设置为唯一约束。

每当一个新的工作秩序即将被插入一个特定的网站,为最大(SiteWorkorderNum)的任何人所登录的SITEID应用程序检查和返回值的INSERT语句。我想避免的问题是,如果同一个网站的两个用户同时进入新的工作订单。

我有几个可能的解决方案,但我想看看是否有更好的方法,因为每个都有缺点,但我肯定会比另一个更好,当然我也接受新的想法。

1)锁表,以保证没有其他用户检索SiteWorkorderNum值,直到经过我们检索和插入我们的价值观(但是让我们假设我们有用户试图进入工单,每分钟几千,岂不如果我收到一个唯一的约束错误,捕获错误并再试一次,请不要锁定表,并检索下一个可用的SiteWorkorderNum并尝试插入到数据库中直到我成功。 (这可能保持腾出表,但再次假装我们在同一地点有成千上万的用户,将在多个数据库调用有点低效?)

我是不是太偏执了有关如何这两种解决方案“可能'效果表现?当然,我没有成千上万的用户,但我想在这个设计的情况下,我曾经在一个项目里面确实有高流量的工作应用的最佳实践。

回答

0

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

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