'Lost update'与'Write skew'



有人可以解释一下我之间的确切区别吗数据库事务理论中的"丢失更新"和"写入偏差"?有人可以给我举个例子吗?

非正式地说,丢失更新写入偏差是并发写入事务相互干扰的方式。

当基于过时数据在事务中进行更新时,会发生写入偏差。过时数据是由事务读取的值,该值由于随后从并发事务提交写入而变得过时。

当一个事务写入的已提交

值被来自并发事务的后续已提交写入覆盖时,会发生更新丢失。 事实上,丢失更新实际上是写入偏差的特例;将更新应用于已过时的数据的位置。

请考虑零售商店的数据库维护库存表的情况。 数据库实现事务隔离

"库存"

表有一个"产品 ID"列和一个"库存"列,用于计算特定产品当前有库存的商品数量。 每次购买(交易)都会将"库存"值减去购买的商品数量。

想象一下,商店有两台电动剃须刀(特定型号)库存。

两个客户分别购买其中一个剃须刀。

每个并发购买(交易)从剃须刀的"库存"记录中读取相同的值(两个)。 每个事务递减"InStock"计数器,并将更新的值 (1) 提交到数据库。 提交两个并发事务后,计数器将错误地指示剃须刀仍有库存(剩余一件)。

其中一个更新丢失了。

假设数据库实现了快照隔离(具有丢失的更新检测),在这种情况下,不会发生丢失的更新 这是因为快照隔离会检测何时发生丢失的更新。 事务提交数据后,数据库将中止尝试为相同数据提交写入的并发事务。 在我们的示例中,中止事务的进程启动一个新事务以重新读取"InStock"列,递减它,然后提交更新的值。 假设没有其他冲突,此更新记录的尝试将成功提交,并且"库存"列包含(正确的)值零。

事务隔离是一个深层次的话题。

此外,假设数据库在清单历史记录表中记录库存历史记录。"库存历史记录"表包含"时间戳"、"产品 ID"和"库存"列(购买剩余)。根据设计,对库存历史记录表的更新是采购交易记录中的最后一道工序。 提交两个事务后,相应的库存历史记录将分别反映一个"库存"值 - 这是不正确的,因为其中一个记录应反映零的"库存"值。 不正确的清单历史记录写入偏差的一个示例。

在这种情况下,快照隔离不会阻止异常数据写入数据库,因为没有更新丢失 相反,写入的数据是异常的,因为事务读取的值已过时 - 这是写入偏差快照隔离不能防止写入倾斜。 为了防止写偏差,数据库必须实现可序列化的隔离。

阅读本文,详细了解写入倾斜、可序列化性和快照隔离。

  • 丢失的更新是两个事务读取同一行以更新它,但第一个提交的更新被第二个提交的更新覆盖。

  • 写入偏差是两个事务读取相同的数据以插入、更新或删除行,但提交的数据不一致。

首先,这是下面的丢失更新的示例。有product,有id namestock如下所示。

product表:

编号 名字 股票
1 苹果 10
阿拉伯数字 20

最新更新