1.加锁
缺点:下降性能
优势:减小代码逻辑复杂度(题主如今这样超过1w条就删数据的逻辑,感受看起来就点糟糕啊,若是整个系统一复杂,这样的来回写数据,你肯定你的逻辑还维护得下去?建议题主梳理一下代码的逻辑流)
2.队列(redis/各种mq等)
缺点:引入其余组件,增长系统复杂度,下降稳定性。
优势:可以将web的并行逻辑串行,其实和加锁差很少,不过更优雅,而且性能上面也更可控。若是题主的系统的逻辑复杂,推荐采用这种。
建议:php写多你会发现,它的逻辑就是一波流的。在它的逻辑层实现过多的重试,等待,以及回写,会致使php很臃肿。建议要么在数据库层上锁,要么引入队列等待,要么就直接报错,让用户F5重试,若是用ajax重试,几乎没有用户体验上的问题。那么来讲一下直接报错的方案。
3.建一个计数器表
举例:
create table store_count (total int(11) NOT NULL) ENGINE=InnoDB
抢计数器:
若是我查出来如今总数是2,那么我 update store_count set total = 3 where total = 2
若是更新成功,说明如今的总行数是3,能够去插表,若是未更新,说明这时已经有其余用户插入了,直接给用户报错,让他下次请求再来过。
缺点:这种方式其实比前两个更粗暴,前2种方式仍是等待的,这种方式直接丢弃了部分用户流量,带来的是一个有缓存特性的计数器来实现题主提的逻辑。
这个计数器在内存中效果更佳。
建议题主根据自身的系统情况,和代码逻辑,进行性能、开发效率、逻辑成本、维护成本上的取舍。
===================================================================================
用一个计数器
我最近在作一个项目 高并发选课系统
每次insert以前先计数器+1而后判断他的值是否大于max
若是大于max计数器自减1 相似回滚
若是小于max 执行insert语句
ps:计数器自增和自减须要保证其原子性
推荐Redis来作计数器 max也能够用redis来存.
====================================================================================
用队列
====================================================================================
加锁就行,要么锁表,要么锁程序,加了锁就至关于变成队列执行,一次只能一我的拿到锁,只能一我的经过,去插入数据。
php里可使用文件锁,或memcached锁也行,文件锁会致使阻塞。
能够搜索:php锁,php文件锁