给定一个在关系数据库上运行的事务,触发一系列 SELECTS。
我假设如果在此事务的中间,任何其他事务对数据库提交一些更新或插入,则此新数据对于前一个事务中剩余的其余选择是可见的。这个假设是否正确?
我的意思是,我假设事务不是为了读取而隔离的(它总是读取数据库的最后状态,即使它同时发生变化),但仅针对写入,是是吗?
如果这取决于每个 RDBMS 的事务策略,那么 Oracle 的策略是什么?
最佳答案
您的假设是正确的,至少对于 Oracle 而言。
Oracle 保证在给定时刻执行的读取的一致性。一旦读取开始,其他事务是否更改了被选择的数据并不重要——Oracle 保证数据是读取开始时数据库中的数据。如果它不能兑现该保证,您将收到“ORA-01555 快照太旧”错误。但是,后续选择可能不会得到相同的答案。
为了提供读取隔离/可重复读取,您必须放弃一些并发性,因为您必须锁定表以防止更新。 Oracle 选择高并发——读者不阻塞。
如果您只是查找给定时间点的数据,Oracle 确实提供了闪回查询。
关于sql - SELECT 的事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522185/