2012-02-08 35 views
0

MERGEを実行するストアドプロシージャがあります。 2つの要求がUPDATEの代わりにINSERTを同時に呼び出していることが、トラフィックの量を考慮しているようです。これらの要求の1つは、外部キー制約のために失敗します。私がマッチステートメントを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; 
を使用して並行性をテストすることをおすすめします。
関連する問題