多个用户同时调用同一个存储过程

求助多个用户同时调用同一个存储过程
本帖最后由 dsa88885555 于 2015-07-09 15:18:28 编辑
假设有下面的存储过程
ALTER PROCEDURE [dbo].[p_DelteSales]  
@Office_Code nvarchar(20),
@Invoice_No  nvarchar(20), 
@InvoiceLine_No nvarchar(80) ,                    
@finalAccept_No nvarchar(20) output 
AS

BEGIN
declare @procductCD nvarchar(20)
declare @saleQTY nvarchar(20)

--获取产品cd,数量
select @procductCD=procductcode,@saleQTY=saleQTY 
from  dbo.T_Sales
where SaleCode=@Invoice_No
and SaleBrCode =@InvoiceLine_No

---库存更新
update dbo.T_INV
set 数量  = isnull(数量,0)+@saleQTY,
where 仓库CD=@Office_Code
and procductcode=@procductCD

--dbo.T_Sales数据删除
delete dbo.T_Sales
where SaleCode=@Invoice_No
and SaleBrCode =@InvoiceLine_No

set @finalAccept_No='1'
END

这时候 同时有用户A和B 对这个存储过程进行调用,会出现这种情况吗?
A先执行之后得到了一个procductCD和@saleQTY 然后后面的库存更新还没执行的时候
B开始调用存储过程,得到了另一个procductCD和@saleQTY  然后A在执行库存更新的时候使用了B得到的那个数据呢?

或者A先执行之后得到了一个procductCD和@saleQTY 然后后面的库存更新还没执行的时候
B开始调用存储过程,导致A后面的存储过程不执行呢?



如果有这些问题的话,这个存储过程要如何修改呢。
------解决思路----------------------
调用时 锁资源
begin tran

end tran
------解决思路----------------------
可以让多个用户同时调用同一个存储过程时依次执行,而不是同时执行

可以使用事务和锁来操作

有一种叫应用程序锁的锁也许能满足你的需要
您可以通过sp_getapplock 来获得特定的锁,以锁定该过程,当该过程完成后,可以使用sp_releaseapplock;来释放锁


exec sp_getapplock 'ProcLock','Exclusive','session'
exec 实际的存储过程
exec sp_releaseapplock 'ProcLock','session' 

http://www.cnblogs.com/wenjl520/archive/2012/08/24/2654412.html