MySQL获得下一个唯一值而没有自动增量

时间:2012-06-09 05:20:06

标签: mysql unique-constraint table-locking

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

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

WorkorderID 是自动增量字段 SiteID SiteWorkorderNum 都设置为唯一约束。

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

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

1)锁定表格以确保在我们检索并插入我们的值之前,没有其他用户检索SiteWorkorderNum值(但是我们假装有数千名用户试图进入工作状态每分钟都有订单,不会让表锁定慢下来吗?)

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

我是否过于偏执于这些解决方案中的任何一种''效果表现?当然,我没有成千上万的用户,但我想在这个设计中应用最佳实践,以防我从事过高流量的项目。

1 个答案:

答案 0 :(得分:0)

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

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