在update语句中递增时是否存在并发问题

时间:2013-06-02 19:12:58

标签: sql-server concurrency

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

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

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

我是否会遇到UserA将余额从100增加到120并且UserB将余额从100增加到180并因此失去UserA所做的更改的情况

3 个答案:

答案 0 :(得分:1)

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

当允许第二个用户的交易运行时,该值已经更新为120,因此第二次更新将从120更新为200.

答案 1 :(得分:0)

只要在该表上执行UPDATEINSERT语句,就会在表上获取锁。由于这种锁定,不可能发生这种冲突。

用户1将更新该值,并且在事务完成后,用户2也可以更新该值。

RDBMS尊重ACID principles,这样就分开了不同语句的执行。你不应该担心这件事的冲突。

答案 2 :(得分:0)

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