丢失更新理解

Kev*_*ith 5 transaction

https://habr.com/en/company/postgrespro/blog/467437/ 给出了以下丢失更新的示例:

例如,两笔交易将把同一账户的金额增加 100 欧元(? 是俄罗斯卢布的货币符号)。第一个事务读取当前值 (?1000),然后第二个事务读取相同的值。第一个交易增加了金额(这给出了 ?1100)并写入了这个值。第二个事务的行为方式相同:它获得相同的 ?1100 并写入该值。结果,客户损失了?100

我读了几次。但我不明白客户是如何丢失P100的。请解释。

Pau*_*ite 14

有两个单独的交易(T1 和 T2),每笔交易都会为客户的余额增加 100 英镑。

预期的结果是:

  • T1读取当前余额为?1000,加上?100,并写入?1100
  • T2读取当前余额为?1100,加上?100,并写入?1200

或者反过来(T2然后T1)。重要的一点是应用了 ?100 的两个增量。

在丢失更新的示例中,会发生如下情况:

  • T1 读取当前余额为?1000
  • T2 读取当前余额为?1000
  • T2 添加 ?100(到它读取的 ?1000),并写入 ?1100
  • T1 添加 ?100(到它读取的 ?1000),并写入 ?1100

这样最终的余额是?1100,而不是?1200,所以客户损失了?100。