Sql 选择的事务隔离级别

Sql 选择的事务隔离级别,sql,database,oracle,transactions,rdbms,Sql,Database,Oracle,Transactions,Rdbms,给定在关系数据库上运行的事务,触发一系列选择 我假设,如果在事务的中间,任何其他事务都会提交一些更新或插入数据库,这个新数据对于前一个事务中剩下的选择是可见的。这个假设正确吗 我的意思是,我假设事务不是为读取而隔离的(它总是读取数据库的最后一个状态,即使它在这段时间内发生了变化,),但仅为写入而隔离,是吗 如果这取决于每个RDBMS的事务策略,那么Oracle的策略是什么?您的假设是正确的,至少对于Oracle是这样 Oracle保证在给定时刻执行的读取的一致性。一旦开始读取,其他事务是否会更改

给定在关系数据库上运行的事务,触发一系列选择

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

我的意思是,我假设事务不是为读取而隔离的(它总是读取数据库的最后一个状态,即使它在这段时间内发生了变化,),但仅为写入而隔离,是吗


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

您的假设是正确的,至少对于Oracle是这样

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

为了提供读取隔离/可重复读取,您必须放弃一些并发性,因为您必须针对更新锁定表。Oracle选择了高度并发—读卡器不会阻塞


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

复制并粘贴作为问题注释给出的答案:


Oracle中的默认隔离级别为“读取提交”(您可以“看到”其他事务提交的更改,即使这些更改是在事务启动后提交的)。Oracle还允许您将隔离级别设置为“可序列化”(仅“查看”事务启动时其他事务提交的更改)或“只读”(如“可序列化”,但不允许插入、更新或删除)。有关所有详细信息,请参见。

Oracle中的默认隔离级别为“读取已提交”(您可以“查看”其他事务提交的更改,即使这些更改是在您的事务启动后提交的)。Oracle还允许您将隔离级别设置为“可序列化”(仅“查看”事务启动时其他事务提交的更改)或“只读”(如“可序列化”,但不允许插入、更新或删除)。有关所有详细信息,请参阅。为什么要将其放在评论中而不是答案中?在一个答案中,可以投票选出正确的答案……好吧,“阅读手册”不是一个很好的答案。但是,如果你发现我指给你的材料对你有帮助,你可以随时对评论进行投票……好吧,我建议你复制它作为答案,这样我就可以选择它作为答案,因为我认为它比其他答案更准确地回答了问题,并且提供了参考。否则我会做的。无论如何谢谢你的帮助!参考非常有趣。当隔离级别为只读提交时同意。正如Brian Camire指出的,当隔离级别可序列化时,事务中的所有SELECT都保证在同一时间点。