Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库事务';写歪斜';和';更新丢失';_Sql_Database_Transactions_Snapshot Isolation - Fatal编程技术网

Sql 数据库事务';写歪斜';和';更新丢失';

Sql 数据库事务';写歪斜';和';更新丢失';,sql,database,transactions,snapshot-isolation,Sql,Database,Transactions,Snapshot Isolation,有人能解释一下“写歪”和“写歪”到底有什么区别吗 数据库事务理论中的“丢失更新”? 有人能给我举个例子吗?非正式地说,丢失的更新和写入倾斜是并发写入事务相互干扰的方式 写入倾斜发生在基于过时数据在事务中进行更新时。 过时数据是由事务读取的值,该事务由于并发事务的后续提交写入而变得过时 丢失更新发生在一个事务写入的提交值被并发事务的后续提交写入覆盖时。事实上,丢失更新实际上是写倾斜的特例;将更新应用于已过时的数据 考虑零售商店的数据库维护库存表的情况。数据库未实现事务隔离 库存表有一个“Produ

有人能解释一下“写歪”和“写歪”到底有什么区别吗 数据库事务理论中的“丢失更新”?
有人能给我举个例子吗?

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

写入倾斜发生在基于过时数据在事务中进行更新时。 过时数据是由事务读取的值,该事务由于并发事务的后续提交写入而变得过时

丢失更新发生在一个事务写入的提交值被并发事务的后续提交写入覆盖时。事实上,丢失更新实际上是写倾斜的特例;将更新应用于已过时的数据

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

库存表有一个“ProductId”列和一个“InStock”列,用于统计特定产品当前的库存数量。每次购买(交易)都会将“InStock”值减去购买的物品数量

假设该商店有两个电动剃须刀(特定型号)库存

两名客户同时购买其中一个剃须刀

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

其中一个更新丢失

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

此外,假设数据库将库存历史记录在InventoryHistory表中。InventoryHistory表有“Timestamp”、“ProductId”和“InStock”(购买后剩余)列。 按照设计,对InventoryHistory表的更新是采购事务中的最后一个操作。在两个事务提交之后,各自的InventoryHistory记录将分别反映“Instock”值1——这是不正确的,因为其中一个记录应反映“Instock”值0。不正确的InventoryHistory记录是写入倾斜的一个例子

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


对于写倾斜、序列化和快照隔离的严格讨论。

我认为将丢失的更新描述为写倾斜的特例并不完全正确。在学术界,这些被认为是独立的情况,因为您可以有意义地说,数据库系统通过快照隔离防止丢失的更新,而不是写倾斜。正如这里所说的:回顾它,我只是有点困惑,因为我读到快照隔离允许写倾斜,但不允许丢失更新。对未来读者的一些澄清:写倾斜涉及到并发事务写入不相交的字段集。丢失的更新涉及并发事务写入重叠的变量集。