这个问题楼主问的比较粗糙,解决核心是数据库是一定要加锁的,否则根本做不到并发造成的多个客服读到同一个订单而导致多人编辑该订单的情况。
假设数据库是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 != "编辑中"的订单记录,其他人需要等待事务提交后才能读到数据。如果事务等待超时时间比较短,可以设置长一点,同时如果操作失可以再读一遍。