我有一个小木屋表,其中一个小木屋被一个帐户引用......
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
我认为问题在于如果同时运行此查询,则一个查询可能会锁定一个表的一半而另一个可能会锁定另一个表,并且死锁将确保。有没有解决的办法?例如,是否可以以相同的顺序锁定所选的小屋行?
干杯,伊恩。
答案 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
但为什么你为什么不使用身份属性来做这种事情而不是试图自己动手?