mysql和oracle的事务隔离级别_oracle之事务隔离级别

本文小节了oracle中事务隔离级别。

ANSI SQL标准定义了4中隔离级别:

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

隔离级别允许或不允许的3种现象

Dirty read(脏读):能读到未提交的数据。

Nonrepeatable read(不可重复读):可能会出现丢失更新。

Phantom read(幻像读): 已读的数据不会改变,和以前相比,可能会有更多满足条件的数据。

ANSI隔离级别

隔离级别                             脏读          不可重复读       幻像读

READ UNCOMMITTED        允许           允许               允许

READ COMMITTED            不允许        允许               允许

REPEATABLE READ           不允许        不允许           允许

SERIALIZABLE                 不允许        不允许           不允许

以下部分测试例子。

1、READ UNCOMMITTED

允许脏读,不可重复读和幻像读。这里想更改隔离级别,直接报错。

SQL> SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED;

SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED

*

ERROR at line 1:

ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }

2、READ COMMITTED

oracle的默认隔离选项。事务只能读取数据库中已经提交的数据。不允许脏读。

session 1:

SQL> conn test/test

Connected.

SQL> SET TRANSACTION

2  ISOLATION LEVEL

3  READ COMMITTED;

Transaction set.

SQL> select * from t;

X

----------

1

session 2:

SQL> conn test/test

Connected.

SQL> SET TRANSACTION

2  ISOLATION LEVEL

3  READ COMMITTED;

Transaction set.

SQL>  select * from t;

X

----------

1

session 1:

SQL> update t set x=2;

1 row updated.

SQL> insert into t values (3);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;

X

----------

2

3

session 2:

SQL> select * from t;

X

----------

2

3

==>验证了允许不可重复读和幻象读。

3、REPEATABLE READ

能给出一正确的结果,避免丢失更新。即不允许脏读和重复读,允许幻读。

4、SERIALIZABLE

最高程度的隔离性。即不允许脏读,不可重复读和幻读。

session 1;

SQL> select * from t;

X

----------

1

session2:

SQL> select * from t;

X

----------

1

SQL> SET TRANSACTION

2  ISOLATION LEVEL SERIALIZABLE;

Transaction set.

SQL>  select * from t;

X

----------

1

session1:

SQL> insert into t values (2);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;

X

----------

1

2

session 2:

SQL>  select * from t;

X

----------

1

SQL> update t set  x=2;

update t set  x=2

*

ERROR at line 1:

ORA-08177: can't serialize access for this transaction

==》自事务后,session1又添加了一行为2记录,session2更改报错。

总结:

1.oracle只允许隔离级别更改为SERIALIZABLE和READ COMMITTED,默认为READ COMMITTED。

2.设置为最高级别的隔离选项(SERIALIZABLE)后,可能会在事务内遇到ORA-08177。

end;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25923810/viewspace-2142945/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值