我有一个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