SELECT的事务隔离级别

时间:2011-12-15 15:08:25

标签: sql database oracle transactions rdbms

如果在关系数据库上运行事务,则触发一系列SELECTS。

我假设如果在此事务的中间,任何其他事务对数据库提交一些UPDATE或INSERT,则此新数据对于前一事务中的其余剩余选择是可见的。这个假设是否正确?

我的意思是,我假设事务没有被隔离用于阅读(它总是读取数据库的最后状态,即使它同时发生了变化),但仅针对着作,是它?

如果这取决于每个RDBMS的事务策略,那么Oracle的策略是什么?

2 个答案:

答案 0 :(得分:4)

您的假设是正确的,至少对Oracle来说是这样。

Oracle保证在给定时刻执行的读取的一致性。一旦启动读取,其他事务是否会更改所选数据并不重要 - Oracle保证数据是读取开始时数据库中的数据。如果它无法兑现该保证,则会出现“ORA-01555快照太旧”错误。但是,后续选择可能得不到相同的答案。

为了提供读取隔离/可重复读取,您必须放弃一些并发性,因为您必须锁定表以防止更新。 Oracle选择高度并发 - 读者不会阻止。

如果您只是在给定时间点查找数据,Oracle会提供闪回查询。

答案 1 :(得分:0)

复制并粘贴作为对问题的评论给出的答案:

Oracle中的默认隔离级别是“已提交读取”(您“看到”其他事务所提交的更改,即使它们是在事务启动后提交的)。 Oracle还允许您将隔离级别设置为“可序列化”(您只“看到”在事务开始时由其他事务提交的更改)或“只读”(如“可序列化”,但它不是允许INSERT,UPDATE或DELETE)。有关所有详细信息,请参阅link