我有一個SQL Server 2000存儲過程,它只能在任何給定時刻執行一個實例。有什麼方法可以檢查並確保程序目前不在執行中嗎?防止同時執行兩次存儲過程
理想情況下,我希望代碼是自包含和高效(快速)。我也不想做一些事情,比如創建一個全局臨時表來檢查它是否存在,因爲如果程序由於某種原因失敗了,它總會被視爲正在運行...
我已經搜索過了,我認爲這還沒有被問到。如果它已經,對不起。
我有一個SQL Server 2000存儲過程,它只能在任何給定時刻執行一個實例。有什麼方法可以檢查並確保程序目前不在執行中嗎?防止同時執行兩次存儲過程
理想情況下,我希望代碼是自包含和高效(快速)。我也不想做一些事情,比如創建一個全局臨時表來檢查它是否存在,因爲如果程序由於某種原因失敗了,它總會被視爲正在運行...
我已經搜索過了,我認爲這還沒有被問到。如果它已經,對不起。
是有一種方法。使用所謂的SQL Server Application locks。
編輯:是的,這也適用於SQL Server 2000。
如何鎖定虛擬表?如果發生故障,這不會造成死鎖。
我看不出這將如何幫助以任何方式。你能詳細說明嗎? – 2009-07-29 21:17:02
在該過程檢查的開始,如果數據的件被「鎖定」,如果不將其鎖定
在過程的結束解鎖片數據。
即
SELECT @IsLocked=IsLocked FROM CheckLockedTable Where spName = 'this_storedProcedure'
IF @IsLocked = 1
RETURN
ELSE
UPDATE CheckLockedTable SET IsLocked = 1 Where spName = 'this_storedProcedure'
.
.
.
-- At end of Stored Procedure
UPDATE CheckLockedTable SET IsLocked = 0 Where spName = 'this_storedProcedure'
我該如何做到這一點? – 2009-07-29 21:10:03
您可以使用sp_getapplocksp_releaseapplock,如在Lock a Stored Procedure for Single Use Only中找到的示例中所示。
但是,這是你真的想要做什麼?您是否試圖與high isolation level進行交易?在應用程序級別處理這種類型的併發可能會好得多,因爲一般來說,高級語言對這類事情有更好的原語。
你正在使用哪個版本的sql-server? – 2009-07-29 21:08:52
我更新了帖子。抱歉。 – 2009-07-29 21:11:04