使用holdlock更新并检查vs选择

时间:2014-09-26 12:12:48

标签: sql-server tsql

我们需要更新一组表,这应该在1个事务的范围内完成。

我的同事建议采用以下方法

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 ID=@Given_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

您能否指出哪种方法更好并解释原因? 我们可以做得更好吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

最直接的方法是找出两个问题, 并将它们放入SQL Server Management工作室,然后按下显示估计查询计划的按钮。 (或切换"显示查询计划"然后运行查询...)

如果两个查询并排运行,它将显示" cost"相互比较。这个原因只是"最好的"在表现方面。 两个查询似乎都可以锁定一个事务。

在查询格式和方法方面,这是一个意见问题。