2012-02-08 52 views
0

我有一個正在執行MERGE的存儲過程。似乎給定了流量,兩個請求同時調用INSERT而不是UPDATE。其中一個請求由於外鍵約束而失敗。如果我把我的merge語句放在try catch中,並嘗試重新執行sproc,我假設它會運行MERGE的UPDATE部分,並且這次成功了。有關這方面的想法,它被認爲是好的/壞的做法?SQL在try catch塊內重新執行存儲過程

我正在使用SQL Server 2008,如果重要的話。

歡呼提前

回答

0

您可以在try/catch塊複製它,但更好的解決方案可能是同時運行的時候,以解決鎖定。此前MERGE語句,規範的方式來實現這樣的事情如下:

BEGIN TRANSACTION; 

UPDATE dbo.Table WITH (HOLDLOCK) 
SET Col = @Val 
WHERE Key= @Something; 

IF @@ROWCOUNT = 0 
    INSERT INTO dbo.TABLE (Key, Col) VALUES (@Key, @Val); 

COMMIT TRANSACTION; 

所以,用MERGE,我建議你做以下幾點:

MERGE dbo.Table WITH (HOLDLOCK) ...

我也推薦使用http://www.datamanipulation.net/sqlquerystress/

0
-- Verify that the stored procedure does not already exist. 


IF OBJECT_ID ('usp_GetErrorInfo', 'P') IS NOT NULL 
    DROP PROCEDURE usp_GetErrorInfo; 
GO 

-- Create procedure to retrieve error information. 
CREATE PROCEDURE usp_GetErrorInfo 
AS 
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; 
GO 

BEGIN TRY 
    -- Generate divide-by-zero error. 
    SELECT 1/0; 
END TRY 
BEGIN CATCH 
    -- Execute error retrieval routine. 
    EXECUTE usp_GetErrorInfo; 
END CATCH;