2012-02-08 55 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;