Sql Oracle事务和读取一致性

Sql Oracle事务和读取一致性,sql,oracle,transactions,database-concurrency,Sql,Oracle,Transactions,Database Concurrency,假设我为所有在12点之前使用sql*plus与朋友注册的人提供彩票。没有存储时间戳的列,也就是说,每行中只有一个名称列表。一个人在11点59分之前就把票插进去了 他在11:59开始更新他的(行)详细信息,将他的女佣添加到他的彩票名单中(只需提交)。另一个运行insert语句的人在11:59开始他的第一次插入(仅针对他自己)(只需要提交)。这是一张有2000万行的大桌子 现在是12点。将此视为Read提交隔离级别。 彩票批开始,将注册用户移动到其他一些表。 之后(很可能是下一纳秒),m1和m2都提

假设我为所有在12点之前使用sql*plus与朋友注册的人提供彩票。没有存储时间戳的列,也就是说,每行中只有一个名称列表。一个人在11点59分之前就把票插进去了

他在11:59开始更新他的(行)详细信息,将他的女佣添加到他的彩票名单中(只需提交)。另一个运行insert语句的人在11:59开始他的第一次插入(仅针对他自己)(只需要提交)。这是一张有2000万行的大桌子

现在是12点。将此视为Read提交隔离级别。

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

我的select语句是否会将m1和m1的女仆以及m2一起添加到彩票中奖者名单中


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

否。一旦您运行SQL,Oracle server将为您的会话维护数据快照,因此,任何进一步的提交都不会在正在读取的SQL中可见。

您能解释一下scn在这方面的作用吗?图13-1事务和读取一致性m2块将有最近的SCN,但它找不到任何回滚。那么oracle如何决定这个问题呢?oracle为每个事务分配一个SCN,即使是正在读取的事务。因此,当读取块时,发动机将跳过SCN较高的任何块。如果块被替换并且具有更高的SCN,则引擎将在回滚段中查找上一个块。写入数据时,块会自动放入RBS。您的读取会话运行的时间越长,到达RBS的数据就越多,因为Oracle需要它为您提供一致的快照。至于像m2这样的全新区块,Oracle确实知道以前没有数据,因此不需要去查询RBS。