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



我想跟踪分支机构和他们持有多少钱。我想要一个Branches表,它有一列叫做Balance。我将维护分支执行的事务日志。

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

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

我会有这样一种情况,UserA将余额从100增加到120,UserB将余额从100增加到180,从而失去UserA

所做的改变吗?

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

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

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

只要在表上执行UPDATEINSERT语句,就会获得锁。由于这个锁,不可能有这样的冲突。

用户1将更新该值,在事务完成后,用户2也将能够更新该值。

rdbms尊重ACID原则,通过这种方式,不同语句的执行是分开的。你不必担心这件事的冲突。

最新更新