2017-05-25 10:35:05 3200次浏览 4条回答 0 悬赏 20 金钱

场景描述:
有两个平台:web(网页端)和ipad(移动端)。
操作:
网页端操作某个按钮会对class表里的type字段更新为1。而移动端也有个按钮会对class表里的type字段更新为0。

出现的问题:
由于网页端处理class表里的type更新为1速度慢一些。当点击网页端的按钮(这时候type还没有更新成1呢,比较慢),移动端这时候点击了按钮class的type值被更新成了0。这时候网页端才运行完毕,然后把class的type更新为1了。

实际需要的:
移动端进入后class的type更新成0是对的。但是由于网页也点击了,后面又把class的type更新成1了,这就错误了。

怎么解决这个并发问题?

补充于 2017-05-25 12:06

情况1:
$updateCommon['type'] = 1;
OrderCommon::updateAll($updateCommon, ['orderId' => $orderId]);

情况2:
$orderModel->orderCommon->type = 1;
$orderModel->orderCommon->save();

这两种更新方式,哪个更快?

  • 回答于 2017-05-25 11:31 举报

    这个应该是网页到数据库执行操作移动端到执行数据库更新要晚吧;执行操作肯定分先后的,数据库更新会自动锁表的。要么在刚进方法就进队列,个人觉得没意义;这个和网络有点关系,导致你以为 你先点击网页,在点移动端,其实在方法里应该是先接受到移动端的请求,之后才是网页吧

    2 条回复
    回复于 2017-05-25 11:35 回复

    网页和移动端,分别调用自己的方法,不是调用同一个方法的。

    回复于 2017-05-25 13:22 回复

    那你为什么要更新type ,意义是什么呢? 比如默认值是多少,移动端从什么更新为0,是不是考虑一下当前type值,是否符合更新?同样网页端也是一个道理。
    看你补充的情况1和情况2,没有可比性吧? 1不需要实例化,2则需要。
    以上个人观点,有不同看法,提出交流下

  • 回答于 2017-05-25 11:41 举报

    推荐一篇文档给力看看,或许有用
    mysql事务,并发,锁机制

  • 回答于 2017-05-25 11:55 举报

    个人觉得可以在更新的方法上加锁,同一时间只能有一个操作进行。

    1 条回复
    回复于 2017-05-25 11:56 回复

    并且在进入方法的时候校验type的值

  • 回答于 2017-05-25 15:58 举报

    首先 你的需求就没有明确.这种多端可以同时登陆的情况,或者多用户可以同时修改的情况,都是按照请求时间的先后顺序来处理的.像你的例子,2端肯定不可能同时请求到服务器的,都有个先后顺序.要么先改成0,再改成1,要么先改成1,再改成0.
    其次,一个折中的办法,先改成功后,后一个不能修改.就是把更新时间附带在请求中.例如,2端刷新页面,从表中取出更新时间{time},A端请求附带type=0&time={time},更新条件有time=={time},可以成功,time值变化成time1,B端请求type=0&time={time},更新条件中time等于{time1},不成功,更新失败.所以A端成功,B端失败

您需要登录后才可以回答。登录 | 立即注册
灰太狼
副总裁

灰太狼

注册时间:2016-11-19
最后登录:2023-07-14
在线时长:76小时17分
  • 粉丝28
  • 金钱3290
  • 威望150
  • 积分5550

热门问题