2014-09-26 3 views
1

Нам необходимо обновить набор таблиц, и это должно быть сделано в рамках одной транзакции.Update and check vs Select with 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

Просто попробуйте в тестовой среде и узнайте. «Преждевременная оптимизация - это корень всего зла» - Дональд Кнут. –

+0

'begin tran' ' SELECT * tbl1 WITH (updlock, holdlock) WHERE TradeId = 3' 'update tbl1 SET ПродавецID = 12 Где TradeId = 3' ' commit tran' Прекрасно работает! – Vahagn

+0

Предложение вашего коллеги делает именно то, что вы делаете, но вставляет некоторые значения в таблицу @tmp. В зависимости от важности этих данных (вставленные значения в таблицу tmp) можно судить о том, какой подход лучше. –

ответ

0

Самый простой способ узнать, как взять ваши два запроса: и поместить их в студию управления SQL Server, а затем нажать кнопку, где будет отображаться оценочный план запроса. (или переключить «план отображения отображения», а затем запустить запрос ...)

Если оба запроса запускаются рядом друг с другом, он отображает «стоимость» по сравнению друг с другом. Это причина только «наилучшего» с точки зрения производительности. Оба вопроса, похоже, блокируются в одну транзакцию.

Это вопрос мнения, когда дело доходит до форматирования и метода запроса.