Oracle相当于SQL Server Snapshot隔离

时间:2014-01-29 02:58:56

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

在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模式然后我的会话2将继续等待
  2. 如果我使用READ_UNCOMMITTED ISOLATION模式,那么我的会话2将给出5000(相当于在select语句中使用nolock)
  3. 在Oracle中,如果我执行等效的命令集,默认情况下它的行为就像设置了READ_COMMITTED_SNAPSHOT隔离模式一样。

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

    - Oracle默认如何实现这一目标?

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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