分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
实际项目中经常有产生结构复杂的编号的业务需求,例如用户表中有个字段叫LUID是公司统一用户识别号,当每次注册一个用户时,需要产生一个不重复的LUID,他的产生规则比如是3位随机码+12位顺序码+3位随机加校验码。
3位随机码生成很简单,顺序码比如从10000000开始,每次加1,最后的3位随机加校验码是通过随机生成的码和顺序码再经过计算得到,这个只要有了顺序码,就可以产生了。
所以重点还是顺序码怎么产生?
通常就是通过上一条用户信息的ID字段来生成,因为ID是数据库自增1产生的,正好满足了顺序码每次加1的需求,在这里ID+10000000就是顺序码了。但是得考虑并发的问题,就是当两个用户同时注册时,大家都去拿上一条的用户Id,因为大家都还没执行插入提交事务,所以拿到的id一样,那顺序码就一样了,这明显就产生了并发问题!为了防止并发时产生的顺序码一致,可以通过给表加锁,锁住表之后,再select获取最近的一条用户记录的主键ID,然后就可以产生LUID了,然后插入数据库后,最后释放锁。但是这样做会性能很慢,因为你锁表了,导致不能对该表进行增删改。
还有一种思路,就是利用数据库自身的机制来完成。可以在用户表中再新增一个带有唯一性约束的字段,比如verifyCode,当注册时,从用户表中查到最近的用户信息,依然通过这条信息的ID字段值产生顺序码,从而产生LUID,然后verifyCode的值就设置为ID的值+1,然后插入用户表。当有一条并发了,那它获取的ID和之前的那条是一样的,那verifyCode值也一样,那当这条在插入用户表时会报错,因为verifyCode是唯一的,不允许重复,这时候是数据库报错了,然后我们就可以提示用户注册失败,请稍后再试!这样就解决了问题,而且不需要加性能昂贵的锁了!
这一切的重点就是数据库的自身机制:唯一性约束的字段不允许重复。