17,741
社区成员
发帖
与我相关
我的任务
分享
select top (1) * from [订单处理表] where 处理方 is null or GETDATE() > 超时点;
-- 拿到订单号,假设123,和同步点,假设0x002
2、打标志,表示处理中,同时设置超时
update [订单处理表] set 处理方 = 'me', 超时点 = DATEADD(minute, 30, GETDATE()) where 订单号 = 123 and 同步点 = 0x002;
-- 设置处理方,设置超时,检查ExecuteScalar的返回。1表示成功放标,0表示其他人已经抢走。
3、处理订单
select top(1) * from [订单处理表] where 处理方 = 'me' and 订单号 = 123;
-- 取回更新后的同步点,假设0x003
4、处理完毕后,从订单处理表中移走。
delete [订单处理表] where 订单号 = 123 and 同步点 = 0x003;
-- ExecuteScalar返回1表示成功,如果返回0,表示其他人拿走处理了(超时)。
每个步骤都要检查影响行数目,同步点这里很重要,是正确处理的保证。