Sql-Server
如何限制 SQL 儲存過程一次由一個人執行?
我有一個儲存過程,它基本上從一個表中選擇值並將它們插入到另一個表中,這是一種歸檔。我想避免多人同時這樣做。
在此過程執行時,我不希望其他人能夠啟動它,但是我不希望序列化,其他人在我完成後執行該過程。
我想要的是讓其他人在我執行該過程時嘗試啟動它以獲取錯誤。
我嘗試過使用 sp_getapplock,但是我無法完全阻止該人執行該過程。
我還嘗試使用 sys.dm_exec_requests 查找過程並阻止該過程,雖然這確實有效,但我認為這不是最佳選擇,因為在某些伺服器上我沒有執行 sys.dm_exec_sql_text(sql_handle) 的權限。
對我來說最好的方法是什麼?
要添加到@Tibor-Karaszi 的答案,設置鎖定超時實際上不會產生錯誤(我已經針對文件送出了 PR)。sp_getapplock 只返回 -1,因此您必須檢查返回值。所以像這樣:
create or alter procedure there_can_be_only_one as begin begin transaction declare @rv int exec @rv = sp_getapplock 'only_one','exclusive','Transaction',0 if @rv < 0 begin throw 50001, 'There is already an instance of this procedure running.', 10 end --do stuff waitfor delay '00:00:20' commit transaction end
在 proc 的開頭使用 sp_getapplock,並將鎖定超時設置為非常低的值。這樣,當您被阻止時,您會收到錯誤消息。