并发 同时编辑

比如我们网站有很多订单 , 但是 管理权限的客服有很多人 .

如何防止多人同时编辑呢

1、多状态嘛,编辑的时候,把状态改成编辑中,其他人不可以操作,完成了再把它状态修改下,这个是比较容易操作的。

 

2、

比较科学的做法

1.提交方式是ajax
2.订单增加last_update_dateline字段存时间戳,每次修改更新该字段
3.提交订单时对比时间戳,如果晚于last_update_dateline,提示ajax弹框提示用户已经被修改过,是刷新加载新的订单内容,还是继续提交

 

 

3、解决核心是数据库是一定要加锁的,否则根本做不到并发造成的多个客服读到同一个订单而导致多人编辑该订单的情况。假设数据库是mysql,innodb引擎,订单表为orders,id为主键。所有的客服首先看到一个订单列表,然后客服点击某个订单进入订单修改页面,进入订单修改页面的php逻辑如下:

1,update orders set status="编辑中" where id=xx and status != "编辑中";

检查update语句执行后返回值,如果返回值为1(1表示更新了一行数据),表示更新成功,否则提示该订单正在编辑中。
上面的方法有两个要点:
1,update操作默认会锁住行,update执行完成后释放行锁;
2,status != "编辑中" 很重要,假设a,b两个客服并发访问,a先执行update操作,那么b会等待a操作完成才能执行自己的update操作,等待完后发现status= "编辑中",所以b什么都不做,虽然update操作成功,但是更新的行数为0;

另外一种情况是有很多需要修改的订单系统随机分配给客服,就是说客服一进入某个页面会看到一个需要修改的订单,并且要求客服们看到的订单不能重复,逻辑可以是这样:
1,begin;(开始一个事务)
2,select * from orders where status != "编辑中" limit 1 for update;
3,将得到这个订单update操作设置 status = "编辑中"
4,commit;

要点是第2步会锁定所有status != "编辑中"的订单记录,其他人需要等待事务提交后才能读到数据。如果事务等待超时时间比较短,可以设置长一点,同时如果操作失可以再读一遍。

 

 

posted @ 2016-12-13 18:27  agang_19  阅读(337)  评论(0编辑  收藏  举报