首页 > 解决方案 > 如何使用 MySQL 存储过程获取线程安全最大值以查找下一个序列号?

问题描述

我需要使用最后一个最大编号生成下一个证书编号。

我现在正在做的事情如下:

  1. 使用 MAX() 获取 MAX 证书编号

  2. 将 +1 添加到 MAX 值。

  3. 返回新的证书编号。

    DECLARE lastNumber INT 默认 0;

    从证书中选择 max(certificate_type) INTO lastNumber WHERE certificate_type=1;

    SET newNumber = lastNumber + 1;

    插入证书(id、certificate_number、certificate_type)值(NULL、newNumber、1);

不幸的是,这不起作用,我收到重复条目。事实是,当我当时选择 MAX() 时,在当前操作期间添加了其他条目。

我也不能使用自动增量 ID,因为有不同类型的证书号有自己的序列号。

id   |   certificate_number   |   certificateType
1    |   ABC-000001           |   1
2    |   XYZ-000001           |   2
3    |   ABC-000002           |   1

有没有办法在执行当前操作之前读取锁定表或任何其他解决方案来获得可靠的下一个数字?

标签: mysqlsqlmultithreadingstored-proceduresthread-safety

解决方案


您可以使用以下方式锁定表LOCK TABLES

LOCK TABLES certificates WRITE;
-- your select and insert queries
UNLOCK TABLES;

推荐阅读