0
点赞
收藏
分享

微信扫一扫

MySQL编程实战三之求任务执行批次号

三分梦_0bc3 2022-01-28 阅读 84


MySQL编程实战三之求任务执行批次号

需求:

想产生一个与时间有关的process_id;需要考虑到批次号的不冲突性。例如有很多任务同时执行,这个同时很有可能是在同一毫秒上,所以我们最好使用一个随机数来完成这个需求。

实现一:

​select floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000) + floor(1000 * rand()) as process_id;​

这个实现是有问题的,问题出现在加法上,一个​​time1+rand1​​很有可能是与​​time2+rand2​​相等的。所以不能用加法实现唯一性。取而代之的是拼接。

实现二:

这里采用扩位的方式,即把结果扩大1000倍,在后三位上加上随机数。但是这样的操作会因为bigint的位数不够而”隐式报错”

​select floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000)*1000 + floor(100 * rand()) as process_id;​

mysql> select  floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000)*1000 + floor(100 * rand()) as process_id;
+----------------------+
| process_id |
+----------------------+
| 20180725172236820000 |
+----------------------+
1 row in set (0.00 sec)

实现三:

最后的实现方式是:​​select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand());​

可以用xshell同时执行命令测试一下:

mysql> select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand()) as process_id;
+--------------------+
| process_id |
+--------------------+
| 180725172859527100 |
+--------------------+
1 row in set (0.00 sec)
mysql> select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand()) as process_id;
+--------------------+
| process_id |
+--------------------+
| 180725172859517060 |
+--------------------+
1 row in set (0.00 sec)

可以发现几乎不会雷同。而且大概率情况下还有一个0作为千位。这样的话,可以进一步修改执行命令:​​select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(1000 * rand()) as process_id;​



举报

相关推荐

0 条评论