4

我想跟踪分支机构以及他们持有多少资金。我想要一个Branches表,其中有一列名为Balance. 我将维护分支执行的事务日志。

我会让应用程序执行这样的语句......

UPDATE Branches SET Balance = Balance + @Amount WHERE BranchID = @BranchID

我是否会遇到UserA将余额从 100 增加到 120 并将UserB余额从 100 增加到 180 从而失去由UserA

4

3 回答 3

1

[适用于SQL Server - 但对于其他 RDBMS 也应该有些相同]
第一个开始更新该行的用户将独占锁定该行 - 因此没有第二个用户可以同时开始更新。

当第二个用户的事务被允许运行时,该值已经更新为 120,因此第二次更新将从 120 变为 200。

于 2013-06-02T19:23:09.240 回答
0

每当在该表上执行UPDATEorINSERT语句时,都会在该表上获取锁。由于这个锁,不可能有这样的冲突。

用户 1 将更新值,交易完成后,用户 2 也将能够更新值。

RDBMS 尊重ACID 原则,因此不同语句的执行是分开的。你不应该担心这件事的冲突。

于 2013-06-02T19:23:13.017 回答
0

这对任何 SQL 服务器都不是问题,除非表以某种方式损坏。通常发生的情况是 SQL Server 将锁定表以进行更新,然后释放以进行下一次更新。如果请求同时进入,一个将在另一个之前执行,但都不会被丢弃。

于 2013-06-02T19:23:56.607 回答