我有一个将信息插入SQL数据库的应用程序。然后它必须运行繁重的存储过程。问题是当我有超过2或3次调用此SP时,它开始抛出错误。
我为避免此问题所做的是向表中添加一个标志,如:
IF NOT EXISTS(SELECT TOP 1 File_Key FROM File WHERE Flag_Value = 3)
BEGIN
WHILE EXISTS(SELECT TOP 1 File_Key FROM File WHERE Flag_Value = 1)
BEGIN
DECLARE @LocalFile_Key int = (SELECT TOP 1 File_Key FROM File WHERE Flag_Value = 1)
UPDATE File
SET Flag_Value = 3
WHERE File_Key = @LocalFile_Key
File Process...
Update File
Set Flag_Value = 2
Where File_Key = @LocalFile_Key
END
END
但是我仍然可以看到有时2个商店程序会运行,这非常奇怪。当商店出现问题时,它会离开Flag_Value' 3'所以它锁定了存储过程。
答案 0 :(得分:0)
在程序开始时添加此块。
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'ProccessFileProc', @LockMode = 'Exclusive';
IF @result < 0
BEGIN
ROLLBACK TRANSACTION;
END
通过这个解决方案并发调用sp等待另一个sp来完成。