沉重的存储过程可以等待另一个SP完成吗?

时间:2014-12-11 18:10:56

标签: mysql sql tsql stored-procedures

我有一个将信息插入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'所以它锁定了存储过程。

1 个答案:

答案 0 :(得分:0)

你遇到了并发问题。你可以通过app锁来锁定并发程序的执行。在程序开始时由sp_getapplock锁定并在程序结束时通过sp_releaseapplock释放锁定,当程序调用它时获取锁定并且另一个并发调用程序应等到调用程序首先释放锁定

在程序开始时添加此块。

DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'ProccessFileProc', @LockMode = 'Exclusive';
IF @result < 0
BEGIN
    ROLLBACK TRANSACTION;
END

通过这个解决方案并发调用sp等待另一个sp来完成。