先找到設定一個比現在所有會員號都大的會員號。
例如現在最大的會員號是03100005556 那麽下一個會員設定為03100010000,中間相差的部分放棄不用了。
然後每注冊一個新用戶,就用03100010000+id作為會員號。例如新註冊了用戶id=5678,那麼會員號就是03100015678 新註冊時先插入數據,獲得id後再update sn,這樣就可以避免併發衝突了。因為用主鍵做唯一。

解决方案 »

  1.   

    1.把你所有id取出来,得到最大的id,后期新增的数据,按照最大值后面新增。
    2.用户注册并发,可以通过memcache或者redis,数据写入缓存当中。
      

  2.   

    你没有完全理解 fdipzone 的算法
    他的意思是:
    存在 id 和 sn 两列,id 为自增。
    若 max(sn) = 03109999999
    则有常量 n = max(sn) - max(id)
    使得 n + (max(id)+1) = max(sn) = 03110000000
    这样就从先前的混乱中走出来了,当然这就要缺失相当数量的 sn 资源所以你也可以通过以下算法来完成补漏操作
    select a.sn, b.sn as bsn from 表 a left join 表 b on a.sn+1=b.sn having bsn is null limit 1
    这样就找到了一个不连续的 sn
    sn + 1 就是该插入的 sn
    只需在 sn 上建唯一索引,并在插入失败时重新尝试,就可解决并发问题
    待表中 sn 的间歇全部充满后,再采用 dipzone 的算法(毕竟那样数据库运算量要小得多)