我有SQL Server 2000的存储过程只能在任何给定时刻正在执行一个实例。有没有什么办法来检查并确保该程序不是正在执行中的?
理想情况下,我想代码是自成体系的,高效(快速)。我也不想这样做创建一个全局临时表,它的生存确认,因为如果过程由于某种原因失败,它将始终被视为运行...
我搜索,我不认为这已经被问呢。如果已经,对不起。
是的,有一种方式。用所谓的SQL Server Application locks。
编辑:是的,这也适用于SQL Server 2000。
您可以使用sp_getapplock sp_releaseapplock如在锁定一个Stored Procedure for Single Use Only发现的例子。
但是,是你真正想要做什么?你们是不是要得到一个high isolation level交易?你也可能会好得多处理这种类型的并发应用程序级别为一般高级语言已经为诸如此类的事情要好得多元。
如何锁定一个虚表?在出现故障的情况下,这不会导致死锁。
在检查过程的开始,如果数据片被“锁定”,如果不将其锁定
在过程的结束解锁片数据。
即
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'
一位在答复共享最初的外部链接的有帮助的信息,但我个人更喜欢独立的答案/片断是这里的堆栈溢出问题页面上。请参阅下面片段为我所用,解决了我的(类似)的问题。如果任何人有问题(或调整的建议),请插入内容。
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[MyLockedAndDelayedStoredProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [GetSessionParticipantAnswersFromEmailAddressAndSessionName]
GO
CREATE PROCEDURE [MyLockedAndDelayedStoredProcedure]
@param1 nvarchar(max) = ''
AS
BEGIN
DECLARE @LockedTransactionReturnCode INT
PRINT 'MyLockedAndDelayedStoredProcedure CALLED at ' + CONVERT(VARCHAR(12),GETDATE(),114);
BEGIN TRANSACTION
EXEC @LockedTransactionReturnCode =sp_getapplock @Resource='MyLockedAndDelayedStoredProcedure_LOCK', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout = 10000
PRINT 'MyLockedAndDelayedStoredProcedure STARTED at ' + CONVERT(VARCHAR(12),GETDATE(),114);
-- Do your Stored Procedure Stuff here
Select @param1;
-- If you don't want/need a delay remove this line
WAITFOR DELAY '00:00:3'; -- 3 second delay
PRINT 'MyLockedAndDelayedStoredProcedure ENDED at ' + CONVERT(VARCHAR(12),GETDATE(),114);
COMMIT
END
-- https://gist.github.com/cemerson/366358cafc60bc1676f8345fe3626a3f