【发布时间】:2013-06-04 20:11:46
【问题描述】:
在我们的应用程序中,当用户创建订单时,我们会得到下一个订单,如下所示:
SELECT MAX(CAST(REPLACE(orderNum, 'SO', '') AS SIGNED)) + 1 FROM orders
问题在于,由于客户越来越忙,我们开始看到在完全相同的时间创建的订单会导致重复的订单 #。
处理此问题的最佳方法是什么?我们应该锁定整个订单表还是只锁定行?还是我们应该做交易?
【问题讨论】:
-
为什么不让 MySQL 通过将订单设为auto_incrementing 主键来为您生成订单号?
-
使用 max() 生成下一个 id 从一开始就有缺陷,当您有并发事务时会不正确或无法扩展。使用 DBMS 的内置功能生成数字。