【问题标题】:Oracle equivalent of SQL Server Snapshot isolationOracle 等效于 SQL Server 快照隔离
【发布时间】:2014-02-20 16:07:47
【问题描述】:

在 Microsoft SQL Server 中,我使用 READ_COMMITTED_SNAPSHOT ISOLATION

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

在会话 1 中,将 Principal 从 4000 更新为 5000

BEGIN TRAN
Update MyTable Set Principal=5000 Where InvestorId=10 

现在在第 2 节中,我说

Select Principal from MyTable where InvestorId=10

我得到 4000,因为会话 1 事务未提交。

如果我不使用 READ_COMMITTED_SNAPSHOT 隔离模式,则使用

  1. READ COMMITTED ISOLATION Mode 然后我的 Session 2 将继续等待
  2. 如果我使用 READ_UNCOMMITTED ISOLATION 模式,那么我的会话 2 将给出 5000(相当于在 select 语句上使用 nolock)

在 Oracle 中,如果我执行一组等效的命令,默认情况下它的行为就像设置了 READ_COMMITTED_SNAPSHOT 隔离模式一样。

我在微软文章中读到 SNAPSHOT 隔离模式在更新完成之前写入 tempdb。

-Oracle 默认是如何做到这一点的?

-它是否也在写入磁盘?它会导致 i/o 问题吗?

-Oracle中的默认锁定级别与SQL server不同吗?

提前感谢您的帮助和时间。

【问题讨论】:

  • Oracle 中没有“READ_UNCOMMITTED ISOLATION Mode”的类似物。
  • READ_UNCOMMITTED ISOLATION 是指 Oracle 中的 POST 吗?

标签: sql oracle isolation-level read-committed-snapshot snapshot-isolation


【解决方案1】:

在 Oracle 中,READ_COMMITTED 隔离级别是默认模式,即数据写入数据文件(磁盘),只有在 COMMIT 之后才可供其他会话选择。它为此使用 UNDO 段。 执行选择时不会导致任何 I/O 问题 Oracle 默认使用行级锁定。

您可以查看Oracle DataBase Concepts 的第 9 章和第 10 章了解更多详情

【讨论】:

【解决方案2】:

在 Oracle 中,默认情况下它是一个非阻塞查询。类似于 SQL 快照隔离模式。锁定行为仍然存在,但不影响仅在受影响的行上开始事务之前查询已提交数据的读取,从而避免了脏读。 请参阅第 9 章 - 非阻塞查询。

【讨论】:

  • 请尝试提供更多信息以改进答案,例如示例 - 最好使用与问题相同的示例。
  • 请注意,mssql 的 READ COMMITTED SNAPSHOT 和 SNAPSHOT 并不完全相同。因此,虽然这回答了 OP 的问题,但还有更多要说的:dba.stackexchange.com/questions/54680/…
猜你喜欢
  • 2010-11-10
  • 2011-05-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2011-09-04
  • 2021-10-26
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多