多个用户同时调用同一个存储过程
求助多个用户同时调用同一个存储过程
假设有下面的存储过程
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
假设有下面的存储过程
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