您的位置:首页 > 其它

查询和更新的时候带上订单状态,可以解决同一人和不同人并发产生的问题。

2017-01-07 11:53 627 查看
1:什么叫同一人并发?

某个业务人员处理订单的时候,同事打开了两个网页,两个网页是同一个地址。(假设订单表示t_order)

假设此时订单的状态是1,表示订单创建成功了,等待支付,(同时假设支付成功订单的状态是2,支付失败订单的状态是3,订单状态字段是orderStatus)

2:同一人并发的问题。

如果我们处理订单的时候,查询不带订单的状态,而是通过订单的id去查询,那么就会产生很大的问题。

同一人打开了2个页面处理一个订单,假设10:00时,该业务人员在第一个页面支付该订单,(假设有个支付按钮)

10:10的时候,他又进入了第二个页面,由于忘记之前在第一个页面支付过该订单,该业务人员又点击了一次支付按钮,因为处理支付的时候,没有带上orderStatus=1去查询订单,所以按照程序的逻辑,他可以支付第二次。

3:问题解决,如果上面的问题,我们支付的时候,(假设支付的时候需要查询一次订单),查询的时候带上orderStatus=1去查询,那么由于第一次支付已经将该状态变成2,或者是3了,那么该订单将无法查询出来,这个时候我们抛出异常,提示业务人员刷新页面,就不会重新支付了。

4:举一反三,如果支付的时候需要更新orderStatus,同理我们update的时候带上where id='' and orderStatus='1',那么两个业务员同时去更新该订单的时候,或者同一个业务员打开多个页面去支付的时候,就只有一次会支付成功。

5:总的来说,update的时候带上订单状态去更新是最可靠的防止并发时重复支付问题的,但是查询的时候带上订单状态,可以更早的发现问题,提示业务人员,程序也可以更加高效的运行,不至于程序运行到最后再发现问题。(另外还有一个问题就是更新成功0条记录,一定要算着更新失败,不然程序的逻辑很混乱)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并发
相关文章推荐