FAQ系列 | 用MySQL实现发号器
2016-12-05 21:40
169 查看
问题:用MySQL实现发号器功能,确保每次取到的ID号都是唯一的
实现:下面是一个大致的思路,抛个砖,欢迎回帖。
根据号段大小,决定是否分成多个表,每个表事先填充各个不同的号段。
每个应用端取号时,设置事务隔离级别为:REPEATABLE READ,并且采用下面的方式读取数据
考虑到并发的问题,建议增加分表数量,每次循环或随机从分表中读取数据,降低对单个表的并发请求。
--------------------------------------分割线--------------------------------------知数堂 (http://zhishuedu.com)培训是由资深MySQL专家叶金荣、吴炳锡联合推出的专业优质培训品牌,主要有MySQL DBA实战优化和Python运维开发课程,是业内最有良心、最有品质的培训课程。
实现:下面是一个大致的思路,抛个砖,欢迎回帖。
根据号段大小,决定是否分成多个表,每个表事先填充各个不同的号段。
每个应用端取号时,设置事务隔离级别为:REPEATABLE READ,并且采用下面的方式读取数据
SELECT `ID` FROM `ID_RANGE_XX` ORDER BY ID LIMIT 1 FOR UPDATE在上述情境中,只要选择某个ID号,那么其他终端也在读取该号时,会产生锁等待,而不会发生ID号被重用的情况。
考虑到并发的问题,建议增加分表数量,每次循环或随机从分表中读取数据,降低对单个表的并发请求。
--------------------------------------分割线--------------------------------------知数堂 (http://zhishuedu.com)培训是由资深MySQL专家叶金荣、吴炳锡联合推出的专业优质培训品牌,主要有MySQL DBA实战优化和Python运维开发课程,是业内最有良心、最有品质的培训课程。
相关文章推荐
- FAQ系列 | 用MySQL实现发号器
- [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
- [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
- [MySQL FAQ]系列 -- 如何直接覆盖 MYI MYD 文件
- [MySQL FAQ]系列 -- 为何innodb表select count(*)很慢
- [MySQL FAQ]系列 -- slave上如何保证只读
- [MySQL FAQ]系列 -- 为什么一直有临时文件
- [MySQL FAQ]系列 -- 如何为一个字段指定字符集
- [MySQL FAQ]系列 -- 写给新手:学会找到问题所在
- [MySQL FAQ]系列 -- 数据表无法读取,并且报错
- [MySQL FAQ]系列 -- 如何更改MySQL的默认字符集
- [MySQL FAQ]系列 -- InnoDB表报错: table is full
- [MySQL FAQ]系列 -- mysql如何调用系统外部程序
- [MySQL FAQ]系列 -- 64位系统下也报内存分配不能超过2G?
- [MySQL FAQ]系列 -- 为何授权不对
- [MySQL FAQ]系列 -- mysqldump出错一例:打开文件数太多
- [MySQL FAQ]系列 -- 如何为一个数据表指定字符集
- [MySQL FAQ]系列 -- 如何为一个数据库指定字符集
- [MySQL FAQ]系列 -- 如何避免repair with keycache
- [MySQL FAQ]系列 -- MySQL支持绑定到多个ip上吗