说明一下:
@n 是返回值
@UsedNum是你传进来的你一个人的消耗量
>> if @n >= 0 then
-----> 表明要保存的数量+表中原始数量>=库存数量
>> update 表 set 消耗数量=库存, 标记=1 where id = @id // !!!
---->偷偷懒嘛, n>=0时表明你的消耗量+原来表中的消耗量已经超过(或者正好=)库
存量了, n的值就是超过库存的具体数目. (又不可能超过库存数量, 为什么不直接把库
存量赋值到消耗量呢?), 有什么可大惊小怪的?
>> else
>> update 表 set 消耗数量=消耗数量+@UsedNum where .... // !!!
----> 你传进来的是你一个人的消耗量, 当然应当在总消耗量上加(别忘了前面的判断,
消耗数量+@UsedNum 肯定 < 库存量的.
代码逻辑上绝对没有问题, 现在的关键只是有关SQL Server的SP是否可中断的问题了.
如果SP可中断, 那么需要另加一个信号量字段, 取数与修改前加锁, 改完了解锁, 其实
也很简单. 只是在取n值的代码前加一句:
Update 表 Set 信号量=1 where (id = @id) and (信号量=0)
然后判断@@Count这个系统变量(是叫这名吗?指示上一次操作的记录数), 如果> 0
则表示加锁成功, 可以进行下面的操作, 并在最后返回前
Update 表 Set 信号量=0 where id = @id
如果为0表示已经被别人锁住了, 可以另外进行处理(或者返回一个特殊值--比如-1提示
让客户端重试).