1

在《Oracle 数据库概念》一书中,Oracle 给出了一个例子来解释Read Committed Isolation Level

在示例中,事务 1 更新第 1 行,然后事务 2 在事务 1 提交之前更新同一行。因此,事务 2 一直等到事务 1 提交。然后事务 1 提交。之后事务 2 提交。当然,事务 2 提交后,事务 1 对行 1 的更新会被事务 2 覆盖。

它将这种情况视为lost update. 但在我看来,它不应该是“丢失的更新”,因为事务 1 已经提交。在单个事务中考虑丢失的更新。无论读取操作如何,该计划甚至等于可序列化计划。

这个例子在这里,或者更具体地说,在这里

在 Oracle 的词汇表中,丢失的更新是 -

一种数据完整性问题,其中一个数据写入者覆盖了修改相同数据的不同写入者的更改。

那么,您对此有何看法?它是“丢失更新”吗?如果是,是否可以通过数据库的并发控制来避免这种丢失的更新?

任何意见和帮助将不胜感激。

4

1 回答 1

2

它被认为是“丢失的更新”,因为会话 2 覆盖了会话 1 所做的更改,而没有意识到它正在这样做。就 Session 2 而言,它读取了薪水为 6200 的“Banda”行并将其更新为 6300 - 它从未看到 Session 1 的更新为 7000。

正如该文档所说:“设计处理丢失更新的策略是应用程序开发的重要组成部分” - 即它不是 DBMS 的内置数据并发功能的一部分。在事务中,这可以通过select for update尝试锁定行来完成。在此示例中,如果会话 2 执行此操作,则会阻止对“Banda”行的选择。会话 1 提交后,会话 2 将获得锁定看到新的薪水。在像 Web 应用程序这样的无状态环境中,使用乐观锁定来实现这一点。

于 2014-06-03T14:27:52.260 回答