【问题标题】:Oracle Transactions and Read ConsistencyOracle 事务和读取一致性
【发布时间】:2014-05-15 12:51:03
【问题描述】:

考虑一下,我正在为所有在 12 点之前使用 sql*plus 注册自己的朋友提供彩票。没有用于存储时间戳的列,例如每行中的名称列表。一个人 m1 已经在 11:59 之前插入了他的票并提交了。

他在 11:59 开始更新他的(行)详细信息,将他的女仆添加到他的彩票列表中(只需提交)。另一个人 m2 运行 insert 语句在 11:59 开始他的第一次插入(只为他自己)(只需要提交)。它是一个有 2000 万行的巨大表格。

现在是 12 岁。将此视为已提交的读取隔离级别。

彩票批次开始,将注册用户转移到其他一些桌子。 之后(很可能在下一纳秒),m1 和 m2 都提交。

我的select语句是否会批量将m1和m1的女仆和m2添加到彩票中奖者名单中?

在回答时考虑 scn(系统更改号)、幻像和不可重复读取。

【问题讨论】:

    标签: sql oracle transactions database-concurrency


    【解决方案1】:

    没有。一旦您运行 SQL,Oracle 服务器就会为您的会话维护数据快照,因此,任何进一步的提交都不会在读取 SQL 中可见。

    【讨论】:

    • 您能解释一下SCN在其中的作用吗?图 13-1 事务和读取一致性docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm m2 块将有很多最近的 SCN,但是它找不到任何回滚。那么,oracle 是如何决定这个问题的呢?
    • Oracle 为每个事务分配一个 SCN,甚至是读取事务。因此,当读取块时,引擎将跳过任何具有更高 SCN 的块。如果块被替换并且具有更高的 SCN,则引擎在回滚段中查找前一个块。当您写入数据时,这些块会自动放入 RBS。阅读会话运行的时间越长,到达 RBS 的数据就越多,因为 Oracle 需要它来为您提供一致的快照。至于全新的block,比如m2,Oracle确实知道之前没有数据,所以不用去RBS查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2021-11-24
    • 1970-01-01
    • 2011-12-31
    • 2018-06-25
    • 2015-06-04
    相关资源
    最近更新 更多