sql
  • sql-server
  • 2016-03-24 73 views 0 likes 
    0

    嗨,我想阻止多個用戶同時更新表。防止多個用戶同時運行相同的SQL Server存儲過程

    在數據庫​​需要更新表"abd.dbo.xyz"。我是SQL新手,但是我寫了一個尚未滿足我需求的代碼。

    任何幫助?

    use [abc] 
    BEGIN TRANSACTION 
    DECLARE @res INT 
    EXEC @res = sp_getapplock 
    @Resource = 'This a Lock ID', 
    @LockMode = 'Exclusive', 
    @LockOwner = 'Transaction', 
    @LockTimeout = 15000, 
    
    IF @res NOT IN (0, 1) 
    BEGIN 
        RAISERROR ('Unable to acquire Lock', 16, 1) 
    END 
    ELSE 
    BEGIN 
    
    -- this is update command which i need to run one instance only 
    Update abc.dbo.xyz set IsKeyProduct= NULL Where IsKeyProduct is not NULL; 
    
    EXEC @res = sp_releaseapplock 
    @Resource = 'This a Lock ID', 
    @DbPrincipal = 'public', 
    @LockOwner = 'Transaction' 
    
    END 
    COMMIT 
    
    +0

    你可能會做更多的工作比必要理會。檢查表提示,看看他們是否做你想做的:https://technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx。 –

    +1

    這是什麼原因? DBMS處理這個。 – Dane

    +0

    而不是更新命令我有一個存儲過程大約需要60分鐘才能完成。同時,如果有其他用戶運行相同的proc,則需要很長時間才能完成(90分鐘)。所以我想避免這個問題。 – Ramaq

    回答

    0

    您正在檢查結果是否在(0,1)中,而1表示過程必須等待鎖釋放。如果您檢查只(0),這意味着鎖定立即(因此PROC沒有其他實例中運行過程中出現)

    最簡單的方法是使用sp_getapplock在存儲過程授予。

    Exec @lokcResult =sp_getapplock @Resource='MyLock', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout = 500 
    

    你shuold檢查@lockResult後,如果它不等於0,你應該沒有做任何事情回來。 見getapplock文檔:https://msdn.microsoft.com/en-us/library/ms189823.aspx

    @LockOwner='Transaction'告訴只要事務運行到持有鎖,所以你不實際需要與釋放鎖

    相關問題