假设我有一个有库存字段的表。
如果我这样做:
Update Mytable set Stock = stock -5 where ID = 123;
记录123是否在更新前被阻止,因此我可以确定记录的库存量是否正确,或者不是更新库存的好方法?
非常感谢。
答案 0 :(得分:1)
并发和隔离之间存在滑动比例。你得到的越多,得到的就越少。所以,你可以这样做:
DECLARE @Stock int;
BEGIN TRAN
SELECT @Stock=Stock
FROM dbo.MyTable
WHERE ID = 123
WITH (UPDLOCK); --lock the row for update
--inspect @Stock to make sure it's what you're expecting
UPDATE dbo.MyTable
SET Stock = Stock - 5
WHERE ID = 123;
COMMIT TRAN
这样做的缺点是,任何其他人在您激活交易时都会尝试读取该行。但它也确保没有人会将行更新为除您认为的值之外的其他值。