代码之家  ›  专栏  ›  技术社区  ›  Ian Warburton

如何从表中选择未引用的行并将其锁定?

  •  1
  • Ian Warburton  · 技术社区  · 14 年前

    我有一个小木屋表,其中一个小木屋被一个帐户引用。。。

    CHALET
    ------
    int ChaletId PK
    int Berth
    
    ACCOUNT
    -------
    int AccountId PK
    int ChaletId FK
    

    小木屋一开始是没有参照的。当用户购买chalet时,代码需要找到一个未引用的chalet并将其分配给新创建的帐户。我认为,返回的小屋需要有一个UPDLOCK在它,直到帐户,将参考它已提交,以防止被分配同一小屋并发购物者。

    SELECT * FROM CHALET WITH (UPDLOCK) c
    LEFT JOIN ACCOUNT a
    ON c.ChaletId = a.ChaletID
    WHERE a.ChaletID is null
    AND Berth = 4
    

    我认为问题在于,如果这个查询是并发运行的,那么一个查询可能会锁定一个表的一半,而另一个查询可能会锁定另一半,而死锁可以确保。有办法吗?例如,是否可以按相同的顺序锁定选定的小屋行?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Martin Smith    14 年前

    会吗 (UPDLOCK, ROWLOCK, READPAST) do what you need

        2
  •  1
  •   Rawheiser    14 年前

    我认为,当您确实需要应用程序处理临时保留时,您正在尝试使用SQL并发锁定。

    • 使所有其他查询排除正在保留的项。
    • 在回滚的情况下,您需要解除该预订。
        3
  •  0
  •   SQLMenace    14 年前

    SELECT * FROM CHALET WITH (UPDLOCK, HOLDLOCK) c
    LEFT JOIN ACCOUNT a
    ON c.ChaletId = a.ChaletID
    WHERE a.ChaletID is null
    AND Berth = 4