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

The update is an atomic operation? (update stock)

假设我有一个 table 有一个股票字段。

如果我这样做:

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

记录 123 在更新之前是否被阻止,以便我可以确定该记录具有正确的库存数量,或者这不是更新库存的好方法?

非常感谢。

并发和隔离之间存在一个滑动比例。你得到的越多,你得到的越少。所以,你可以这样做:

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

这样做的缺点是,当您的事务处于活动状态时,其他任何人都试图读取该行。但它也确保没有人会将行更新为您认为的值以外的值。