回调函数执行的sql语句,已经判断了如果订单号存在就不保存记录.
但是回调函数有时候同一秒中同时发送2个或3个请求,同时执行都判断表中没有此订单号。
导致此sql语句同时执行了2次,数据库保存了2条记录,请问如何避免并发?declare @fysh int
set @fysh=0
select @fysh=count(1) from 微信支付记录 where 微信订单号='asdfsdfdfdfdfdf'
if(@fysh=0)
begin
--执行新增语句
        insert into 微信支付记录.....
end

解决方案 »

  1.   

    那你sql改成下面这个sql,这样可以避免重复更新,待这个结果通过后,然后再更新业务
    update xxx
    set status =1 
    where id=xxx and status =0 
      

  2.   

    的确会有这样的情况发生
    1:如果你的订单号是支付前生成的。那么回调就是update操作,假设你的订单表里有一个字段叫state,1表示支付成功,初始状态是0
    那么回调后
    update 订单表 set state=1 where orderno='sdfsdf' and state=0
    if @@RowCount >0
    beginend
      

  3.   

    的确会有这样的情况发生
    1:如果你的订单号是支付前生成的。那么回调就是update操作,假设你的订单表里有一个字段叫state,1表示支付成功,初始状态是0
    那么回调后
    update 订单表 set state=1 where orderno='sdfsdf' and state=0
    if @@RowCount >0
    begin
         加你支付后要加的虚拟货币
    end2:如果你的订单号是回调后生成的,那么对于订单表就是insert操作,把订单号放入队列中去重。或者你订单表把订单号设为主键或唯一索引,自已处理主键冲突时的错误。