查询和更新的时候带上订单状态,可以解决同一人和不同人并发产生的问题。
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条记录,一定要算着更新失败,不然程序的逻辑很混乱)
某个业务人员处理订单的时候,同事打开了两个网页,两个网页是同一个地址。(假设订单表示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条记录,一定要算着更新失败,不然程序的逻辑很混乱)
相关文章推荐
- sql server在高并发状态下同时执行查询与更新操作时的死锁问题
- mysql定时任务和事件解决订单自动更新状态问题
- iis7针对不同域名配置不同运行权限,所有共用web.config产生的问题均可以修改根配置文件解决
- 当某个表中存在标志表格中记录不同状态的判断性字段的时候,采用两种不同的数据库组织形式,查询执行速度的实验。
- 解决列表框更新数据的时候的闪烁问题(VC防止窗口及其控件(如CListCtrl)闪烁的简单方法(一组有用的宏) )
- fcitx 关于多语言,不同编码的一点说明;同时也可以用于解决fcitx不能输入问题
- ECG在DbCore使用实体更新Access数据库的时候返回值为0时的问题解决方法
- AX中动态产生方法并且调用,解决根据不同条件产生不同SQL逻辑的问题很方便
- GDAL更新至1.8.1后,通过属性查询矢量出错问题的解决方式
- 卡巴6.0.1.411版本升级服务器(解决地震造成的不能升级问题(12310125更新,307可以升啦))
- Asp/asp.net下Access数据库查询和更新的各种问题解决方案
- Microsoft JET Database Engine 错误 '80004005' 操作必须使用一个可更新的查询。问题解决办法
- 开发Android的时候遇到的问题及解决方法(不断更新)
- 关于ASP.NET“操作必须使用一个可更新的查询”问题的解决方法
- MySQL中文常见乱码问题解决方法其一,可以解决觉大多是乱码问题。如果你的中文显示为?的时候一般都有效。
- 解决"操作必须使用一个可更新的查询"问题
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 面对web并发访问时候,可能会产生这样的问题,你是怎么设计的
- 面对web并发访问时候,可能会产生这样的问题,你是怎么设计的?
- ECG在DbCore使用实体更新Access数据库的时候返回值为0时的问题解决