更新是原子操作吗? (更新库存)

时间:2015-02-16 09:55:16

标签: sql-server sql-update

假设我有一个有库存字段的表。

  • MyTable(ID,Stock,...)

如果我这样做:

Update Mytable set Stock = stock -5 where ID = 123;

记录123是否在更新前被阻止,因此我可以确定记录的库存量是否正确,或者不是更新库存的好方法?

非常感谢。

1 个答案:

答案 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

这样做的缺点是,任何其他人在您激活交易时都会尝试读取该行。但它也确保没有人会将行更新为除您认为的值之外的其他值。