我想跟踪分支机构以及他们持有多少资金。我想要一个Branches
表,其中有一列名为Balance
. 我将维护分支执行的事务日志。
我会让应用程序执行这样的语句......
UPDATE Branches SET Balance = Balance + @Amount WHERE BranchID = @BranchID
我是否会遇到UserA
将余额从 100 增加到 120 并将UserB
余额从 100 增加到 180 从而失去由UserA
我想跟踪分支机构以及他们持有多少资金。我想要一个Branches
表,其中有一列名为Balance
. 我将维护分支执行的事务日志。
我会让应用程序执行这样的语句......
UPDATE Branches SET Balance = Balance + @Amount WHERE BranchID = @BranchID
我是否会遇到UserA
将余额从 100 增加到 120 并将UserB
余额从 100 增加到 180 从而失去由UserA
[适用于SQL Server - 但对于其他 RDBMS 也应该有些相同]
第一个开始更新该行的用户将独占锁定该行 - 因此没有第二个用户可以同时开始更新。
当第二个用户的事务被允许运行时,该值已经更新为 120,因此第二次更新将从 120 变为 200。
每当在该表上执行UPDATE
orINSERT
语句时,都会在该表上获取锁。由于这个锁,不可能有这样的冲突。
用户 1 将更新值,交易完成后,用户 2 也将能够更新值。
RDBMS 尊重ACID 原则,因此不同语句的执行是分开的。你不应该担心这件事的冲突。
这对任何 SQL 服务器都不是问题,除非表以某种方式损坏。通常发生的情况是 SQL Server 将锁定表以进行更新,然后释放以进行下一次更新。如果请求同时进入,一个将在另一个之前执行,但都不会被丢弃。