gpt4 book ai didi

sql-server - 查看存储过程是否已经在运行

转载 作者:行者123 更新时间:2023-12-02 22:51:55 25 4
gpt4 key购买 nike

这是我在 SQL Server 2012 中运行的存储过程。

ALTER PROCEDURE usp_ProcessCustomers
AS
BEGIN
IF EXISTS (SELECT 1 FROM RunningProcesses WHERE ProcessId = 1 AND IsRunning = 1)
RETURN;

UPDATE RunningProcesses
SET IsRunning = 1
WHERE ProcessId = 1

-- Do processing here
-- Do processing here

UPDATE RunningProcesses
SET IsRunning = 0
WHERE ProcessId = 1
END
GO

可以从应用程序中的多个位置触发此存储过程。如果需要,甚至 DBA 也可以使用 SSMS 触发存储过程。

到目前为止一切顺利。

问题是,如果出现问题或者 DBA 取消存储过程的执行,则 RunningProcesses 中的 IsRunning 值永远不会更新回 0。因此即使存储过程没有运行,系统也始终认为该存储过程正在运行。

我在网上找到了以下脚本,它检查脚本是否正在运行。

SELECT 
r.*, t.text
FROM
sys.dm_exec_requests r
CROSS APPLY
sys.dm_exec_sql_text(r.sql_handle) t
WHERE
r.status IN (N'Suspended', N'Running', N'Runnable', N'Pending')

使用上面的脚本来查明存储过程是否已经在运行是一个好方法吗?如果它已经在运行,那么我将使用 RETURN 关键字退出存储过程。如果这不是一个好主意,那么解决此问题的最佳方法是什么。

最佳答案

使用内置application locks 。 SQL Server 确保在 session 或服务器意外关闭时释放锁。请注意,必须在事务内获取锁。

ALTER PROCEDURE usp_ProcessCustomers
AS
BEGIN
BEGIN TRANSACTION

declare @Lock int
EXEC @Lock = sp_getapplock @Resource = 'ProcessCustomers',
@LockMode = 'Exclusive'
IF (@Lock < 0) -- already locked by another process
RETURN;

-- Do processing here
-- Do processing here

EXEC sp_releaseapplock @Resource = 'ProcessCustomers'

COMMIT TRANSACTION
END

关于sql-server - 查看存储过程是否已经在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21582244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com