我用webman做的项目,如果遇到高并发,会造成数据库数据错乱吗?

问题描述

我用webman做的项目,如果遇到高并发,会造成数据库数据错乱吗?

为此你搜索到了哪些方案及不适用的原因

我的项目是一款问卷,每当用户提交问卷,数据库某个字段会在尾部追加json数据

:如果B用户删除他的提交,A用户正在编辑【A的提交】这个json数据【此时也包含B的提交】,然后他们同时发起请求,那么数据库数据会错乱吗?

疑问:B删除了他的提交,结果A编辑时传过去的数据也包含B,或出现B删除失败的情况吗?(本来B更新后删除成功,结果A携带B数据,更新后,又加上了)

上述都是通过操作数组,然后转json存数据库的,每当用户提交问卷,就会在尾部array_push。然后编辑,删除就是操作这个大数组

1340 9 1
9个回答

不败少龙

其他框架怎么处理的 现在这个就是那样去处理吧

  • 暂无评论
evilk

这个是数据库层面的问题,跟框架没关系

  • PHP甩JAVA一条街 2023-03-09

    那会出现数据错乱吗?多个用户操作一个大数组(涉及增删改),然后一起更新mysql

  • 不败少龙 2023-03-09

    可以用redis去判断 只要有操作了就做相应的判断

  • PHP甩JAVA一条街 2023-03-09

    就是这里, 一直想不通,多个用户操作一个大数组(增加,删除,修改),然后一起发起请求,这个数组会不会乱?你覆盖我的,我覆盖你的

  • 不败少龙 2023-03-09

    可以有人在编辑, 其他人点击编辑就提示有人在编辑数据

  • 不败少龙 2023-03-09

    也可以用websocket去实时监听

  • PHP甩JAVA一条街 2023-03-09

    需求不提示这个,用户操作需要一气呵成的,不能等待别人

  • evilk 2023-03-09

    类似于秒杀,可以将请求排队处理,即使并发来了多个请求,也放进队列,然后消费队列,一个一个处理

  • PHP甩JAVA一条街 2023-03-09

    PHP会同时处理一个方法吗?还是A处理完马上处理B?

  • evilk 2023-03-10

    亲,这边建议,先深入了解一下PHP的基础知识

  • PHP甩JAVA一条街 2023-03-10

    php不是单线程吗?一次处理一个

luohonen

你是不是不知道数据库有一种叫锁? 还有一种队列不知道用么?

he426100

这个问题跟webman无关

nitron

"万物皆可高并发"[滑稽]
race condition不是框架层面去解决的问题

zhzli

所有用户提交问卷都是通过操作数组,然后转json存数据库?为什么不新建一个表来保存提交问卷的记录

  • PHP甩JAVA一条街 2023-03-10

    我想单表更快,省下链表。实际我想了下,那种情况可能性1/1000

南部荒人
  1. 可以尝试一下调整表结构,将“大数组”拉平,原本一条记录的,插入多条数据库记录(类似于对一篇文件的多条评论)。每次插入的记录都是一条新纪录,更新也是更新这条记录。例如用户ABC,三个用户插入过,就是三条记录,D用户进来 更新了B的,依然是三条记录。
  2. 做排他性处理:给这张新表增加时间戳。 例如,当用户X,Y来操作已存在的记录的时候,展示的时候,将记录的时间戳t1 在form中hidden,提交的时候执行: UPDATE TABLE SET content={new content} WHERE id=123 AND t=t1. 如果X先于Y提交,Y就提交不了,提示,在其编辑过程中,其他用户操作过了。建议重新load。。。
  • PHP甩JAVA一条街 2023-03-10

    哥说的有道理,我想我设计有点不对,我想单表查询更快,不过业务平均几十人参加,每人还会随机分发不同线路(1/10),两人同时概率在一条线路并且同一时间更新的可能性很低

  • PHP甩JAVA一条街 2023-03-10

    可以这样:修改前马上把修改id存入redis,设置一个状态(他人不能操作),业务执行完,状态正常(他人可以操作)

PHP甩JAVA一条街

截图
这两种锁,我该使用哪个锁?

Db::table('wj_options')
->where('id', $randOptinsId)
->???  //用哪个锁?
->update($updateArr);

如果update在锁的状态时,其他用户来更新,返回false吧?

MarkGo

建议分表处理,为什么一张问卷表里把答案也存进去?
“我想单表更快,省下链表。”---数据量大的时候,并不见得单表能更快,而且对答案的分组分页你怎么做?如果需要查询呢?
“php不是单线程吗?一次处理一个”---PHP是单线程,但可以多进程,比方传统的php-fpm,启动一个会创建几个进程监听。

所以,分表后不存在你的疑虑,建议分表处理。
另外如果担心mysql扛不住高并发的写入,可以通过INSERT DELAYED或队列等的方式,先把要写入的内容存内存,再去写入。
担心数据丢失的话就走redis队列或RabbitMQ队列,它们不会成为你的瓶颈;
前端也做做手脚,提交的时候适当增加随机延迟参数,比如随机100~800毫秒,对用户感知不高,确能有效削峰。

  • PHP甩JAVA一条街 2023-03-11

    谢谢哥, 项目没法改了, 只能操作大数组了,我的方案是:A操作时,把A的uid和编辑id存到redis,当A操作完了,就删除redis,操作中如果B来操作就查询redis发现A,此时就提示B【太火爆,稍候再试】。 哥我说的这个方案可以吗?

  • PHP甩JAVA一条街 2023-03-11

    用户uid和编辑id, 一对一。谁先把uid和id在redis中存进去,谁就先编辑(编辑完释放redis),其他人则等待

  • MarkGo 2023-03-12

    数据量不大的话倒不如直接就存redis好了,定时回落mysql,冷启动的时候加载去redis

年代过于久远,无法发表回答
🔝