丢失更新
丢失更新
什么是丢失更新,我的理解一直是错误的
定义 :在并发系统中,丢失更新是指一个客户端的更新(基于旧数据计算)被另一个客户端的更新覆盖或忽略,导致最终状态丢失了某些更新的效果。
在我们的例子中: A和B都想扣款50,期望结果是 100 - 50 - 50 = 0(两次扣款都生效)。 但实际结果是50:B的扣款意图(-50)被完全忽略,因为它的Put失败(version不匹配)。这意味着B的更新“丢失”了。 为什么叫“丢失” ?不是数据损坏,而是系统中“应该发生”的状态变化(B的扣款)没发生。最终状态(50)不符合业务逻辑(两次扣款应得0)。 关键点: version控制检测到冲突(B的Put失败),但没解决问题——B的意图被丢弃,客户端需要自己决定“接下来干嘛”(重试?放弃?)。如果B不重试,第二次扣款就“丢失”了。 在分布式系统中,这种情况很危险,因为客户端可能认为“我的请求失败了,算了”,导致业务逻辑错误(e.g., 用户以为扣款没发生,但实际应该扣)。
问题在业务层:
由于B的Put失败,B的扣款没发生。如果B不重试(或重试逻辑错误),整个系统就丢失了B的更新(-50)。最终余额 50 ,只反映A的操作,B的意图被 “吞没“