【发布时间】:2017-04-16 02:00:29
【问题描述】:
我们有表 MySql 5.5:
CREATE TABLE IF NOT EXISTS `invoices` (
`id` varchar(36) NOT NULL,
`client_id` smallint(4) NOT NULL,
`invoice_number` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `client_id_2` (`client_id`,`invoice_number`),
KEY `client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们像这样将数据插入到该表中:
INSERT INTO `invoices` ( `id` , `client_id` , `invoice_number` )
VALUES (
UUID(),
10 ,
( SELECT (MAX(`invoice_number`) +1) as next_invoice_number FROM `invoices` WHERE `client_id` = 10 )
);
“10”是client_id 值。
它可以工作,但是它的并发性很差。我怎样才能有工作的解决方案,具有良好的并发性?
复合主键自动增量不是解决方案。我们需要每个 client_id 值的自动增量。复合主键自动增量在整个表中提供自动增量,而不是每个 client_id 列值。
【问题讨论】:
-
并发性差是什么意思?您的意思是运行大量查询时速度很慢吗?您真的需要为每个用户提供后续发票编号吗?
-
只有一个进程可以创建发票。它锁定了桌子。当另一个应用程序进程尝试插入同一个表时,它基本上会超时。有时可能有 5 个进程启动,等待表解锁。
-
哦,酷,我看到有纯 sql 解决方案。它在这里的另一个问题中得到解决。会将其标记为 stackoverflow.com/questions/677542/auto-increment-by-group 的重复项
-
@dre-hh 复合主键自动增量不是解决方案。我们需要每个
client_id值的自动增量。复合主键自动增量在整个表中提供自动增量,而不是根据client_id列值。 -
在我们的例子中主键不是自动增量,所以它不是重复的问题。