首页 新闻 会员 周边

页面请求并发问题。

0
悬赏园豆:60 [已解决问题] 解决于 2015-01-08 11:54

各位大神,现在小弟碰到这样一个问题,

   一个页面功能“同一个订单号会重复发送多次请求”请求接收后我会到数据库查询是否有过操作,如果没有。调用第三方接口。然后得到返回信息保存此次操作记录。

因此有的时候因为并发,导致同一个订单号调用多次第三方接口。保存多次操作记录。

 

请我该怎样避免这样的情况发生?我是使用C#编程的。数据库微sqlservice2008r2

大辉哥呀的主页 大辉哥呀 | 初学一级 | 园豆:6
提问于:2015-01-06 14:43
< >
分享
最佳答案
1

你没有设计状态迁移机制。已状态迁移加锁,可以完美解决并发问题.

收获园豆:45
吴瑞祥 | 高人七级 |园豆:29449 | 2015-01-07 11:48

小弟太菜,可以详细点说明下吗? 

大辉哥呀 | 园豆:6 (初学一级) | 2015-01-07 11:49

@菜鸟无名: 你订单要设计各个状态.

每一次操作都是将订单从一个状态迁移到另一个状态.

没一次迁移都是一次事务.

比如订单从已付款状态迁移到已发货状态.

1.开启事务

2.修改订单为正在发货状态,当订单状态为已付款时

3.发货逻辑

4.将订单修改为已发货

5.提交事务

吴瑞祥 | 园豆:29449 (高人七级) | 2015-01-07 12:26
其他回答(4)
0

你从数据库查询,然后访问接口,再写入数据库。这个操作过程本身就会耗时,你访问接口的过程中,可能其他的请求也在查询数据库了。对应这个情况,你可以在数据库字段设计的时候,不要用操作与否来作为字段值。而使用:“未操作”,“操作中”来标示。第一个请求到数据库查询后,立刻将状态赋值“操作中”,这样就可以拒绝后面请求继续访问数据。

收获园豆:10
凡一二三 | 园豆:85 (初学一级) | 2015-01-06 15:45
0

加锁

老牛在路上 | 园豆:11 (初学一级) | 2015-01-06 15:48
0

通过遍历来循环显示,首行遍历订单表,在循环体内使用订单号(根据数据库实际情况)来读取商品表中的信息。

webfrom | 园豆:84 (初学一级) | 2015-01-06 16:07
0

架构 楼上的大侠已经说得非常详细了。

小菜我也补充一点, 你页面设计时, 在订单流程时 下一步。。。下一步。。。  当用户上一步时, 你应该让上一步的页面过个期。

收获园豆:5
问天何必 | 园豆:3311 (老鸟四级) | 2015-01-07 16:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册