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

时间:2010-09-11 15:29:15

标签: sql sql-server tsql database-deadlocks

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

CHALET
------
int ChaletId PK
int Berth

ACCOUNT
-------
int AccountId PK
int ChaletId FK

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

如何编写获取小屋的SELECT?我在想这样的事情......

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

我认为问题在于如果同时运行此查询,则一个查询可能会锁定一个表的一半而另一个可能会锁定另一个表,并且死锁将确保。有没有解决的办法?例如,是否可以以相同的顺序锁定所选的小屋行?

干杯,伊恩。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为当您真正需要应用程序处理临时预订时,您正尝试使用SQL并发锁定。

  • 创建标记列或正在进行中的预留的单独表格。
  • 使您的所有其他查询排除正在保留的项目。
  • 如果是回滚,则需要解除该预订。

答案 2 :(得分:0)

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

但为什么你为什么不使用身份属性来做这种事情而不是试图自己动手?