如果在运行时更改存储过程会发生啥?
Posted
技术标签:
【中文标题】如果在运行时更改存储过程会发生啥?【英文标题】:What happens if altering a stored procedure while it is running?如果在运行时更改存储过程会发生什么? 【发布时间】:2013-02-06 16:57:04 【问题描述】:我对一个存储过程进行了细微的一行更改(修正了字符串中的错字),我想尽快将其部署到我们的生产 SQL Server 2005 服务器。
我担心的是,如果在确切的时间运行 alter 语句来更新我的存储过程,会发生什么同时调用该存储过程?
它是否与存储过程的先前副本一起运行,还是会导致某些损坏或错误?
考虑到 SQL Server 的 ACID 特性,我希望它是安全的。 它同时运行的机会,特别是因为 SP 非常小,所以非常低,但我只是更愿意确定,而且我也对答案感兴趣,只是出于教育目的。
可以说,ServerFault 会是一个更好的地方,如果发错了,很抱歉。
谢谢。
【问题讨论】:
当你执行一个存储过程时,它被加载到内存中,被分析,一个查询计划被确定然后被执行。因此,在第一步加载后 - 您可以完全更改它,这不会对您的运行执行产生任何影响。 【参考方案1】:我刚刚在 SQL Server 2008 R2 中对此进行了测试
我开始:
CREATE PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:10'
SELECT TOP 5 * FROM dbo.UniqueId
GO
然后我做了以下 SQL Server 查询窗口 1:
EXEC dbo.Stupid
SQL Server 查询窗口 2,而查询窗口 1 中的查询正在运行:
ALTER PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:05'
SELECT TOP 5 * FROM dbo.UniqueId
WHERE ID > 5
GO
EXEC dbo.Stupid
SQL Server 查询窗口 3,而查询窗口 1 和查询窗口 2 中的查询正在运行:
EXEC dbo.Stupid
结果:
查询窗口 1 运行了 10 秒(因此在窗口 2 和 3 之后完成),并返回 ids 1 - 5 查询窗口 2 更改并在 5 秒内运行该过程,并返回 ids 6 - 10 查询窗口 3 在 5 秒内运行并返回 ids 6 - 10会发生什么:
已经执行的代码将在过程上完成运行,就像它们启动时一样 在代码更改后开始运行的任何内容都将运行新代码【讨论】:
很好的研究!!【参考方案2】:当对过程使用 ALTER 时,会设置模式修改锁。 SP 仍然存在,但客户端必须等到执行 ALTER。 这同样适用于 ALTER,它会一直等到客户端不使用 SP。
【讨论】:
以上是关于如果在运行时更改存储过程会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
由于两次会话同时访问相同的存储过程,因此发生了事务(进程ID)死锁