對於每個呼叫prSuperProc
,它們將以串行方式運行,然後是1,然後是下一個,然後是下一個。但是,如果多個用戶都呼叫prSuperProc
,那麼您將交叉執行用戶1的prProc1-prProc2 + prProc3和用戶2的prProc1-prProc2 + prProc3。
這可能是這樣的:
user1 calls prSuperProc
user1 prProc1 is called
user2 calls prSuperProc
user1 prProc2 is called
user2 prProc1 is called
user1 prProc3 is called
user2 prProc2 is called
user2 prProc3 is called
它實際上取決於是怎麼回事你的程序,有多少併發用戶,什麼行內對它們進行改變和/或鎖定
編輯 你可以試試這個來解決這個問題:通過使用交易
CREATE PROCEDURE [dbo].[prSuperProc]
AS
BEGIN TRY
BEGIN TRANSACTION
EXEC [dbo].[prProc1]
EXEC [dbo].[prProc2]
EXEC [dbo].[prProc3]
--etc
COMMIT
END TRY
BEGIN CATCH
IF XACT_STATE()!=0
BEGIN
ROLLBACK TRANSACTION
END
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage
--will echo back the complete original error message
DECLARE @ErrorMessage nvarchar(400), @ErrorNumber int, @ErrorSeverity int, @ErrorState int, @ErrorLine int
SELECT @ErrorMessage = N'Error %d, Line %d, Message: '+ERROR_MESSAGE(),@ErrorNumber = ERROR_NUMBER(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(),@ErrorLine = ERROR_LINE()
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber,@ErrorLine)
END CATCH
GO
ñ圍繞一切,它將嘗試鎖定任何併發用戶使用相同的數據。使用TRY-CATCH將嘗試捕捉一個過程中可能發生的任何錯誤,並阻止下一個過程運行。
我確定包裝過程只能在任何時候運行一次 - 目前只有我使用過! 我並不是說他們的程序運行不正常,只是在Proc2啓動時Proc1所執行的更新沒有完全提交,而我已經通過手動執行它們來刪除該錯誤,從而證實了這一點。 – meepmeep 2010-04-21 13:14:37
@meepmeep,在所有這些過程(包括包裝)中添加'PRINT'開始prProc1''和'PRINT'結束prProc1''類型語句,然後在SSMS中運行'EXEC [dbo]。[prSuperProc]',帶參數所以Proc1有很長的執行時間(在這種情況下大約10s)來查看會發生什麼。 – 2010-04-21 13:18:26
我已經把它放進去了。一如往常,這個錯誤拒絕再次發生,所以我會把這個Q打開,直到它再次發生,看看結果如何。謝謝! – meepmeep 2010-04-22 09:12:39