我在理解数据库 (Oracle) 中的读取一致性时遇到问题。
假设我是一家银行的经理。一位客户有一把锁(我不知道)并且正在做一些更新。现在,在他获得锁定后,我正在查看他们的帐户信息并尝试对其进行处理。但是由于读取一致性,我将看到在客户获得锁之前存在的数据。那么这不会影响我在此期间获得的输入以及我将要做出的决定吗?
最佳答案
关于读取一致性的要点是:假设客户回滚他们的更改?或者假设这些更改由于违反约束或某些系统故障而失败?
在客户成功提交更改之前,这些更改不存在。您可能基于幻读或脏读做出的任何决定都不会比您描述的场景更有效。事实上,它们的有效性较低,因为更改不完整,因此不一致。具体示例:如果客户的更改包括存款和取款,如果您在他们存款但尚未取款时查看了帐户,您的决定有多有效?
另一个示例:长时间运行的批处理更新组织中每位员工的工资。如果您对员工的薪水进行查询,您真的想要一份报告,其中显示一半的员工有更新的薪水,另一半的员工有旧的薪水吗?
编辑
读取一致性是通过使用 UNDO 表空间(旧实现中的回滚段)中的信息来实现的。当一个 session 从另一个 session 正在更改的表中读取数据时,Oracle 会检索由第二个 session 生成的 UNDO 信息,并将其替换为呈现给第一个 session 的结果集中的更改数据。
如果阅读 session 是一个长时间运行的查询,它可能会失败,因为臭名昭著的 ORA-1555: snapshot too old
.这意味着包含组装读取一致 View 所需信息的 UNDO 范围已被覆盖。
锁与读一致性无关。在 Oracle 中,写入不会阻塞读取。锁的目的是防止其他进程尝试更改我们感兴趣的行。
关于Oracle 事务读取一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704421/