我用webman做的项目,如果遇到高并发,会造成数据库数据错乱吗?
我的项目是一款问卷,每当用户提交问卷,数据库某个字段会在尾部追加json数据
:如果B用户删除他的提交,A用户正在编辑【A的提交】这个json数据【此时也包含B的提交】,然后他们同时发起请求,那么数据库数据会错乱吗?
疑问:B删除了他的提交,结果A编辑时传过去的数据也包含B,或出现B删除失败的情况吗?(本来B更新后删除成功,结果A携带B数据,更新后,又加上了)
上述都是通过操作数组,然后转json存数据库的,每当用户提交问卷,就会在尾部array_push。然后编辑,删除就是操作这个大数组
其他框架怎么处理的 现在这个就是那样去处理吧
这个是数据库层面的问题,跟框架没关系
那会出现数据错乱吗?多个用户操作一个大数组(涉及增删改),然后一起更新mysql
可以用redis去判断 只要有操作了就做相应的判断
就是这里, 一直想不通,多个用户操作一个大数组(增加,删除,修改),然后一起发起请求,这个数组会不会乱?你覆盖我的,我覆盖你的
可以有人在编辑, 其他人点击编辑就提示有人在编辑数据
也可以用websocket去实时监听
需求不提示这个,用户操作需要一气呵成的,不能等待别人
类似于秒杀,可以将请求排队处理,即使并发来了多个请求,也放进队列,然后消费队列,一个一个处理
PHP会同时处理一个方法吗?还是A处理完马上处理B?
亲,这边建议,先深入了解一下PHP的基础知识
php不是单线程吗?一次处理一个
你是不是不知道数据库有一种叫锁? 还有一种队列不知道用么?
业务上不让用这个
这个问题跟webman无关
哈哈,webman好啊
"万物皆可高并发"[滑稽]
race condition不是框架层面去解决的问题
经常看到你, 热心大哥,谢谢
所有用户提交问卷都是通过操作数组,然后转json存数据库?为什么不新建一个表来保存提交问卷的记录
我想单表更快,省下链表。实际我想了下,那种情况可能性1/1000
哥说的有道理,我想我设计有点不对,我想单表查询更快,不过业务平均几十人参加,每人还会随机分发不同线路(1/10),两人同时概率在一条线路并且同一时间更新的可能性很低
可以这样:修改前马上把修改id存入redis,设置一个状态(他人不能操作),业务执行完,状态正常(他人可以操作)
这两种锁,我该使用哪个锁?
如果update在锁的状态时,其他用户来更新,返回false吧?
看不懂这两个锁 - -;
建议分表处理,为什么一张问卷表里把答案也存进去?
“我想单表更快,省下链表。”---数据量大的时候,并不见得单表能更快,而且对答案的分组分页你怎么做?如果需要查询呢?
“php不是单线程吗?一次处理一个”---PHP是单线程,但可以多进程,比方传统的php-fpm,启动一个会创建几个进程监听。
所以,分表后不存在你的疑虑,建议分表处理。
另外如果担心mysql扛不住高并发的写入,可以通过INSERT DELAYED或队列等的方式,先把要写入的内容存内存,再去写入。
担心数据丢失的话就走redis队列或RabbitMQ队列,它们不会成为你的瓶颈;
前端也做做手脚,提交的时候适当增加随机延迟参数,比如随机100~800毫秒,对用户感知不高,确能有效削峰。
谢谢哥, 项目没法改了, 只能操作大数组了,我的方案是:A操作时,把A的uid和编辑id存到redis,当A操作完了,就删除redis,操作中如果B来操作就查询redis发现A,此时就提示B【太火爆,稍候再试】。 哥我说的这个方案可以吗?
用户uid和编辑id, 一对一。谁先把uid和id在redis中存进去,谁就先编辑(编辑完释放redis),其他人则等待
数据量不大的话倒不如直接就存redis好了,定时回落mysql,冷启动的时候加载去redis