更新是原子操作? (更新库存)
The update is an atomic operation? (update stock)
假设我有一个 table 有一个股票字段。
- MyTable(ID, Stock, ...)
如果我这样做:
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
这样做的缺点是,当您的事务处于活动状态时,其他任何人都试图读取该行。但它也确保没有人会将行更新为您认为的值以外的值。
假设我有一个 table 有一个股票字段。
- MyTable(ID, Stock, ...)
如果我这样做:
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
这样做的缺点是,当您的事务处于活动状态时,其他任何人都试图读取该行。但它也确保没有人会将行更新为您认为的值以外的值。