2013-02-21 25 views
15

Tôi có một thay đổi nhỏ, một dòng (sửa lỗi đánh máy trong một chuỗi), thành một thủ tục được lưu trữ mà tôi muốn triển khai cho máy chủ SQL Server 2005 sản xuất của chúng tôi càng sớm càng tốt.Điều gì sẽ xảy ra nếu thay đổi một thủ tục lưu sẵn trong khi nó đang chạy?

Nỗi lo lắng tôi có là những gì xảy ra nếu tại thời điểm chính xác chạy câu lệnh thay đổi để cập nhật thủ tục được lưu trữ của tôi, nó sẽ xảy ra khi có gì đó gọi là thủ tục được lưu trữ cùng một lúc?

Ứng dụng có chạy với bản sao trước của quy trình được lưu trữ hoặc có thể dẫn đến một số lỗi hoặc lỗi không?

Xem xét bản chất ACID của SQL Server, tôi cho rằng nó an toàn. Các cơ hội chạy nó cùng một lúc, đặc biệt là vì SP là khá nhỏ là cực kỳ thấp, nhưng tôi chỉ muốn đảm bảo, và tôi cũng quan tâm đến câu trả lời, chỉ vì mục đích giáo dục.

Có thể cho rằng, ServerFault sẽ là một nơi tốt hơn cho việc này, xin lỗi nếu nó bị đăng sai.

Cảm ơn bạn.

+6

Khi bạn ** thực hiện ** một thủ tục lưu sẵn, nó được nạp vào bộ nhớ, được phân tích, một kế hoạch truy vấn được xác định và sau đó nó được thực thi. Vì vậy, sau khi nó được nạp trong bước đầu tiên - bạn hoàn toàn có thể thay đổi nó, điều này sẽ không có bất kỳ tác động nào đến việc thực thi đang chạy của bạn. –

Trả lời

16

Khi sử dụng ALTER cho quy trình, khóa sửa đổi lược đồ được đặt. SP vẫn tồn tại, nhưng khách hàng sẽ phải đợi cho đến khi ALTER được thực thi. Điều tương tự cũng áp dụng cho ALTER, nó sẽ đợi cho đến khi SP không được khách hàng sử dụng.

+0

Cảm ơn bạn rất nhiều. –

10

Tôi vừa thử nghiệm điều này trong SQL Server 2008 R2

tôi bắt đầu với:

CREATE PROCEDURE dbo.Stupid 
AS 
WAITFOR DELAY '0:00:10' 
SELECT TOP 5 * FROM dbo.UniqueId 
GO 

sau đó tôi đã làm như sau SQL Server Query Window 1:

EXEC dbo.Stupid 

Cửa sổ truy vấn SQL Server 2, trong khi truy vấn trong Cửa sổ truy vấn 1 đang chạy:

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 Query Window 3, trong khi truy vấn trong Query Window 1 và Query Window 2 đang chạy:

EXEC dbo.Stupid 

Kết quả:

  • Query Window 1 chạy trong 10 giây (và do đó kết thúc sau cửa sổ 2 và 3) và trả lại id 1 - 5
  • Query Window 2 thay đổi và chạy các thủ tục trong 5 giây, và trở id 6-10
  • Query Window 3 chạy trong 5 giây và trở về ids 6 - 10

gì xảy ra:

  • Mã thực hiện đã hoàn tất sẽ chạy trên quy trình như khi chúng được bắt đầu
  • Mọi thứ bắt đầu chạy sau khi mã được thay đổi sẽ chạy mã mới
+0

Nghiên cứu tốt !! –

Các vấn đề liên quan