回调函数执行的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
但是回调函数有时候同一秒中同时发送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
update xxx
set status =1
where id=xxx and status =0
1:如果你的订单号是支付前生成的。那么回调就是update操作,假设你的订单表里有一个字段叫state,1表示支付成功,初始状态是0
那么回调后
update 订单表 set state=1 where orderno='sdfsdf' and state=0
if @@RowCount >0
beginend
1:如果你的订单号是支付前生成的。那么回调就是update操作,假设你的订单表里有一个字段叫state,1表示支付成功,初始状态是0
那么回调后
update 订单表 set state=1 where orderno='sdfsdf' and state=0
if @@RowCount >0
begin
加你支付后要加的虚拟货币
end2:如果你的订单号是回调后生成的,那么对于订单表就是insert操作,把订单号放入队列中去重。或者你订单表把订单号设为主键或唯一索引,自已处理主键冲突时的错误。