2014-09-26 53 views
1

我們需要更新一組表,這應該在1交易的範圍內完成。更新和檢查vs選擇與holdlock

我的同事提出了以下方法

Begin Tran 
Declare @tmp Table (id int); 

    UPDATE tbl1 
    SET  --set some fields 
     , [Status] = 3 
    Output deleted.Status 
    Into @tmp   
    WHERE ID = @Given_ID 
     AND [Status] = 7 



    If Exists(SELECT 1 
       FROM @tmp 
       WHERE id = 7) 
    BEGIN 
     -- Do some other updates and inserts 
     ..... 
    Commit Tran 
    RETURN 1 
    END 

    rollback Tran 
    RETURN 0 

我的建議是做如下

Begin tran 
    If Exists(SELECT 1 
       FROM tbl1 WITH (updlock, holdlock) 
       WHERE [status] = 7 AND [email protected]_ID) 
    BEGIN 
    UPDATE tbl1 
    SET  ... 
     , [Status] = 3   
    WHERE ID = @Given_ID 
     AND [Status] = 7 

     -- Do some other updates and inserts 
     ..... 
    Commit tran 
    Return 1 
    END 

    rollback Tran 
    RETURN 0 

能否請您點哪種方法更好,並解釋爲什麼? 我們可以做得更好嗎?

在此先感謝。

+2

只需在您的測試環境中嘗試一下並找出答案。 「不成熟的優化是萬惡之源」 - Donald Knuth。 – 2014-09-26 13:13:21

+0

'begin tran' 'SELECT * tbl1 WITH(updlock,holdlock)WHERE TradeId = 3' 'update tbl1 SET SellerID = 12 Where TradeId = 3' 'commit tran' 工作正常! – Vahagn 2014-09-26 13:54:59

+0

你的同事的建議完全是你做的,但將一些值插入到@tmp表中。根據數據的重要性(插入到tmp表中的值),可以判斷哪種方法更好。 – 2014-09-26 20:30:42

回答

0

找出最直接的方法是將兩個查詢 放到SQL Server Management Studio中,然後按下按鈕顯示估計的查詢計劃。 (或者切換「顯示查詢計劃」,然後運行查詢...)

如果兩個查詢彼此並排運行,它將顯示彼此相比的「成本」。就性能而言,這只是「最好的」。 這兩個查詢似乎鎖定到一個事務罰款。

當涉及到查詢格式和方法時,這是個問題。