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