代码之家  ›  专栏  ›  技术社区  ›  samus

是否可以在不首先更新的情况下读取锁定事务中的表/行?

  •  0
  • samus  · 技术社区  · 6 年前

    我正试图为并发线程中的关键部分提供独占的读访问权。然而,一个 可序列化隔离级别 不足够,因为在进行更新之前不会发生读取块,而不是在需要避免下面的竞争条件时进行初始读取之后。

    DECLARE @x INT
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION 
    
        -- need to read-block other threads here
        SELECT @x = field1 FROM transtest WHERE id = 1;
    
        SET @x = @x + 1;
    
        UPDATE transtest SET field1 = @x WHERE id = 1;
    
    COMMIT TRANSACTION
    

    除了发出一个“良性”的更新来触发一个读锁之外,如下面的示例中所示,还有一种更直接的方法来获取它吗?

    UPDATE transtest 
    SET field1 = (SELECT field1 FROM transtest WHERE id = 1) 
    WHERE id = 1;
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   paparazzo    6 年前

    你为什么不能这么做?

    UPDATE transtest SET field1 = field1 + 1 WHERE id = 1;
    

    OP说其他事情正在发生。我想这就行了。

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION 
    
        -- need to read-block other threads here
        SELECT @x = field1 + 1 
        FROM transtest with (rowlock uplock)
        WHERE id = 1;
    
        //other stuff
    
        UPDATE transtest SET field1 = @x WHERE id = 1;
    
    COMMIT TRANSACTION