我有一个这样的表来管理多用户应用程序中收据累进编号的生成:
ID | Int(11) Auto increment, primary
Progressive_number | Int(11)
External_ID | Int(11)
累进必须相对于外部ID quee,外部ID rap表示对外部表的主ID的引用。
例如:
ID | Prog | ExtID
1 | 1 | 1
2 | 2 | 1
3 | 1 | 2
4 | 3 | 1
5 | 4 | 1
6 | 2 | 2
到目前为止很容易,但问题是,累进数在皇后区中必须是唯一的,而且许多用户可以同时生成累进数
我的第一个想法是读最后一个渐进式,然后插入增量,如下所示:
SELECT MAX(Progressive_number) FROM table WHERE External_id = 2
但是从一些压力测试来看,在我执行连续的INSERT查询之前,其他一些可以读取相同的值,然后执行相同的INSERT,所以我最终得到两个具有相同累进数的收据
我试过嵌套查询
INSERT INTO table (Progressive_number, External_ID)
VALUES(
(SELECT MAX(Progressive_number) FROM table WHERE External_id = 2) + 1,
1)
我有许多较少的副本,但一个副本是太多的这种应用程序。
有一种方法可以将生成完全卸载到mysql服务器,以确保任何数字都是唯一的?
最佳答案
在读写操作期间是否尝试过锁定表?
LOCK TABLES table WRITE;
INSERT INTO table (Progressive_number, External_ID)
VALUES(
(SELECT MAX(Progressive_number) FROM table WHERE External_id = 2) + 1,
1)
;
UNLOCK TABLES;
(另见锁表文档:http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html)
关于mysql - 在同一表格中管理多个渐进数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24912247/