24

我对我想尽快部署到生产 SQL Server 2005 服务器的存储过程进行了细微的一行更改(修复了字符串中的拼写错误)。

我担心的是,如果在确切的时间运行 alter 语句来更新我的存储过程,会发生什么同时调用该存储过程?

它是否与存储过程的先前副本一起运行,还是会导致某些损坏或错误?

考虑到 SQL Server 的 ACID 特性,我希望它是安全的。它同时运行的机会,特别是因为 SP 非常小,所以非常低,但我只是更愿意确定,而且我也对答案感兴趣,只是为了教育目的。

可以说,ServerFault 会是一个更好的地方,如果它被错误发布,对不起。

谢谢你。

4

2 回答 2

30

我刚刚在 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
  • Query Window 3 ran in 5 seconds and returned ids 6 - 10

What happens:

  • Already executing code will complete running on the procedure as it was when they were started
  • Anything that starts run after the code is altered will run the new code
于 2015-09-15T08:07:49.690 回答
25

当对过程使用 ALTER 时,会设置模式修改锁。SP 仍然存在,但客户端必须等到执行 ALTER。这同样适用于 ALTER,它会等到客户端不使用 SP。

于 2013-02-21T11:30:19.557 回答