关于并发的问题

爱吃鱼的猫
  • 63

php后台需要往mysql数据库表里插入记录,这张表的id是主键但不是自增长的,需要通过某种规则计算出来,比如先查看当天创建的记录有N个,那么这次的id就设为xxxN+1.如果访问量比较大情况下,可能多个请求先获取到的记录个数相同,那么就有可能生成相同的id,插入数据库的话就会报错,这种情况应该如何处理呢?

回复
阅读 1.5k
5 个回答

1、如果业务需求一致性很强的话,加锁,或者线程阻塞保证数组的强一致性
2、使用非关系型数据库比如redis或者mongodb或者mecache
3、使用队列

第一种方式:改变主键的规则,换成自增或者其他随机算法生成这种更简单的形式。
第二种方式:单独维护主键的生成与使用,可以先提前按照原来的规则生成一定数量的主键入库,每次插入记录时先从其中获取一个主键,使用后将其销毁,但是需要注意的是适当的时机去补充主键,其实这就是建立了一个动态的数据池。

Redis的incr可以解决

锁数据库并不是一个好办法,可能在并发时导致提交失败。
建议还是修改数据库架构,把当前主键改为unique索引。

建议id做保留字段,如你所说的规则,将日期做一个字段,当天的记录号作一个字段,建立联合唯一索引

redis来计数当天的记录数,如果并发量较大,可以考虑队列消耗

宣传栏