1

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

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

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

干杯,伊恩。

4

3 回答 3

1

(UPDLOCK, ROWLOCK, READPAST) 做你需要的吗?

于 2010-09-11T15:51:34.350 回答
1

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

  • 为正在进行的预订创建一个标志列或单独的表格。
  • 使您的所有其他查询排除正在保留的项目。
  • 在回滚的情况下,您需要取消该预留。
于 2010-09-13T18:03:23.773 回答
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

但是为什么哦,为什么你不为这种东西使用身份属性而不是尝试自己动手呢?

于 2010-09-11T15:33:46.920 回答