我在理解数据库(Oracle)中的读取一致性时遇到了问题。
假设我是一家银行的经理。一个客户得到了一个锁(我不知道),并且正在做一些更新。现在,在他获得锁定后,我正在查看他们的帐户信息,并尝试对其执行一些操作。但由于读取一致性,我将看到客户获得锁之前存在的数据。那么,这是否会影响我在这段时间内获得的输入和将要做出的决定?
发布于 2010-04-24 20:31:40
关于读一致性的要点是:假设客户回滚他们的更改?或者假设这些更改由于违反约束或某些系统故障而失败?
在客户成功提交其更改之前,这些更改将不存在。您可能基于幻影读取或脏读取做出的任何决定都不会比您所描述的场景更有效。事实上,它们的有效性较低,因为更改是不完整的,因此不一致。具体的例子:如果客户的变化包括存款和取款,如果你在他们已经存钱但还没有取款时查看了账户,你的决定会有多有效?
另一个例子:一个长时间运行的批处理过程更新组织中每个员工的工资。如果您对员工的工资运行查询,您是否真的想要一个报告,其中显示一半的员工具有更新的工资,另一半具有旧的工资?
编辑
通过使用还原表空间(旧实现中的回滚段)中的信息来实现读取一致性。当一个会话从另一个会话正在更改的表中读取数据时,Oracle将检索由第二个会话生成的撤消信息,并将其替换为显示给第一个会话的结果集中更改的数据。
如果读取会话是一个长时间运行的查询,它可能会因为臭名昭著的ORA-1555: snapshot too old而失败。这意味着包含组装读取一致视图所需信息的撤消范围已被覆盖。
锁与读取一致性无关。在Oracle中,写操作不会阻塞读操作。锁的目的是防止其他进程试图更改我们感兴趣的行。
发布于 2010-04-25 22:23:30
对于拥有大量用户的系统,用户可能长时间“持有”锁,通常使用Optimistic Offline Lock pattern,即在更新中使用版本...WHERE语句。
您可以使用日期、版本id或其他内容作为行版本。也可以使用虚拟列ORA_ROWSCN,但您需要先阅读它。
发布于 2010-05-07 02:58:54
当记录由于更改或显式lock语句而被锁定时,将在该块的标头中创建一个条目。这被称为ITL (感兴趣事务列表)。当您开始读取该数据块时,您的会话会看到这一点,并知道从回滚段中获取读取一致性拷贝的位置。
https://stackoverflow.com/questions/2704421
复制相似问题