sql - SELECT 的事务隔离级别

标签 sql database oracle transactions rdbms

给定一个在关系数据库上运行的事务,触发一系列 SELECTS。

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

我的意思是,我假设事务不是为了读取而隔离的(它总是读取数据库的最后状态,即使它同时发生变化),但仅针对写入,是是吗?

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

最佳答案

您的假设是正确的,至少对于 Oracle 而言。

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

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

如果您只是查找给定时间点的数据,Oracle 确实提供了闪回查询。

关于sql - SELECT 的事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522185/

相关文章:

SQL Server 查询要按条件选择的前几行

java - null 和 empty char 在 java 中是相等的

php - mySQL 加入哪里?

mysql - SQL - 如何返回包含重复项的一列的所有列字段

java - 使用 PDB 的 Oracle Dataguard 上的 DB 的 Weblogic 数据源配置

database - Oracle DB 从 12c 升级到 19c 对现有 SQL、PL/SQL 脚本和数据模型有何影响?

oracle - 排序是发生在 Oracle 的 DB Buffer 缓存还是 PGA 中?

php - SQL命令计算百分比

php - 尝试向 MySQL 插入数据时出错

mysql - 如何在 SQL 中舍入一个值?