https://habr.com/en/company/postgrespro/blog/467437/ 给出了以下丢失更新的示例:
例如,两次交易将使同一账户的金额增加 ₽100(₽ 是俄罗斯卢布的货币符号)。第一个事务读取当前值 (₽1000),然后第二个事务读取相同的值。第一个交易增加了金额(这给出了 ₽1100)并写入了这个值。第二个事务的行为方式相同:它得到相同的 ₽1100 并写入该值。结果,客户损失了₽100
我读了几遍。但我不明白客户是如何失去 P100 的。请解释。
https://habr.com/en/company/postgrespro/blog/467437/ 给出了以下丢失更新的示例:
例如,两次交易将使同一账户的金额增加 ₽100(₽ 是俄罗斯卢布的货币符号)。第一个事务读取当前值 (₽1000),然后第二个事务读取相同的值。第一个交易增加了金额(这给出了 ₽1100)并写入了这个值。第二个事务的行为方式相同:它得到相同的 ₽1100 并写入该值。结果,客户损失了₽100
我读了几遍。但我不明白客户是如何失去 P100 的。请解释。
有两笔单独的交易(T1 和 T2),每笔交易都会在客户的余额中增加 ₽100。
预期的结果是:
或者反过来(T2 然后 T1)。重要的一点是,两个增量都应用了 ₽100。
在丢失更新的示例中,会发生以下情况:
这样最终余额是₽1100,而不是₽1200,所以客户损失了₽100。
添加到@Paul White 的答案:您链接到的文章指出存在不止一个“级别”的交易“隔离”(想想“强度”),重要的是要知道您在每个交易中处理什么案子。
当我第一次遇到事务时,我认为它们要么全有要么全无,要么按照我天真的期望的方式工作,要么数据库被破坏了。但这并不完全正确:SQL 92 标准可能允许不同类型的不一致
本文对这些错误的外观进行了很好的概述,因此您可以确定它们是否对您的用例造成问题。如果某个特定错误对您的应用程序来说不是问题,那么允许它以换取更高的数据库性能可能是有意义的。
Paul 已经回答了您的直接问题 - 丢失的更新是如何工作的(并且在 SQL 92 下是不允许的)。本文还展示了其他类型的错误是如何发生的,以及允许这些错误的隔离级别的名称。