mysql - 如何使用 MySQL 存储过程获取线程安全最大值以查找下一个序列号?
问题描述
我需要使用最后一个最大编号生成下一个证书编号。
我现在正在做的事情如下:
使用 MAX() 获取 MAX 证书编号
将 +1 添加到 MAX 值。
返回新的证书编号。
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
有没有办法在执行当前操作之前读取锁定表或任何其他解决方案来获得可靠的下一个数字?
解决方案
您可以使用以下方式锁定表LOCK TABLES
:
LOCK TABLES certificates WRITE;
-- your select and insert queries
UNLOCK TABLES;
推荐阅读
- pdf - 解析/转换旧版 Word 文档?(msword2 / 5)
- c++ - 在 Qt3D 中进行碰撞检测的预期方法(或好方法)是什么?
- sql-server - 通过 HTTPS 从 SQL Server 存储过程调用的 WCF 服务
- amazon-web-services - Amazon Redshift - 加入表并找出不匹配的行
- java - java.lang.IllegalStateException: org.hibernate.TransientObjectException(更新记录时)
- r - 无法在 R 中创建具有动态名称的非反应性 RenderPlot 对象
- android - 如何设置灯光弹出主题?
- javascript - 使用 Firebase 数据库规则禁用特定子项的写入
- postgresql - 使用 psycopg2 使用 ACCESS EXCLUSIVE 锁定表
- azure - MS Azure:无法将 Azure 云文件复制到另一个目录