Sql server 防止存储过程同时执行两次

Sql server 防止存储过程同时执行两次,sql-server,stored-procedures,sql-server-2000,Sql Server,Stored Procedures,Sql Server 2000,我有一个SQL Server 2000存储过程,在任何给定时刻只能执行一个实例。是否有办法检查并确保程序当前未执行 理想情况下,我希望代码是自包含且高效(快速)的。我也不想做类似于创建一个全局临时表来检查它是否存在的事情,因为如果该过程由于某种原因失败,它将始终被视为正在运行 我已经搜索过了,我想还没有人问过这个问题。如果是,对不起。锁定一个虚拟表怎么样?在发生故障时,这不会导致死锁。在程序开始时,检查数据块是否已“锁定”,如果未锁定 在程序结束时,解锁数据块 即 是的,有办法。使用所谓的 编辑

我有一个SQL Server 2000存储过程,在任何给定时刻只能执行一个实例。是否有办法检查并确保程序当前未执行

理想情况下,我希望代码是自包含且高效(快速)的。我也不想做类似于创建一个全局临时表来检查它是否存在的事情,因为如果该过程由于某种原因失败,它将始终被视为正在运行


我已经搜索过了,我想还没有人问过这个问题。如果是,对不起。

锁定一个虚拟表怎么样?在发生故障时,这不会导致死锁。

在程序开始时,检查数据块是否已“锁定”,如果未锁定

在程序结束时,解锁数据块


是的,有办法。使用所谓的

编辑:是,这也适用于。

您可以使用锁a中的示例


但是,这就是你真正想要做的吗?您是否正在尝试与客户进行交易?在应用程序级别处理这种类型的并发可能会更好,因为在一般情况下,更高级的语言对于这类事情有更好的原语。

在回复中共享的初始外部链接中有一个有用的信息,但我个人更喜欢在堆栈溢出问题页面。请参阅下面的代码片段,了解我使用了什么并解决了(类似)问题。如果任何人有问题(或调整建议),请插话

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

您使用的是哪个版本的sql server?我看不出这有什么帮助。你能详细说明一下吗?我还没试过,但这看起来是我需要的答案。谢谢我认为这是一个比赛条件。从技术上讲,如果线程的调度恰到好处,两个时间相近的存储过程都可以在其中一个执行更新之前执行选择。
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