ORACLE数据库事务隔离级别

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。

两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

为了处理这些问题,SQL标准定义了以下几种事务隔离级别

READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。

READ COMMITTED 允许幻想读、不可重复读,不允许脏读

REPEATABLE READ 允许幻想读,不允许不可重复读和脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不允许

Oracle数据库支持READ COMMITTED 、SERIALIZABLE两种事务隔离级别。

SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED

设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ COMMITTED|SERIALIZABLE]

也可以在session级设置ISOLATION LEVEL:

ALTER  SESSION SET ISOLATION_LEVEL = {SERIALIZABLE | READ COMMITTED}
READ COMMITTED级别是默认的,不深入讨论,这里我们实验一下在SERIALIZABLE隔离级别下数据库行为是什么样的

当前数据:

SQL> SELECT * FROM TEST2;

        ID
----------
         1
         2
         4

session1下执行:

SQL> alter session SET ISOLATION_level=SERIALIZABLE;

Session altered.

SQL> select * from test2;

        ID
----------
         1
         2
         4

session2下执行:

SQL> delete test2 where id =1 ;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from test2;

        ID
----------
         2
         4

回到session2再次执行前面的query:


SQL> select * from test2;

        ID
----------
         1
         2
         4

结果没有变,与上次查询的结果一样。

 

尝试在session2中删除id=1的记录会发生什么情况:

SQL> delete from test2 where id =1;
delete from test2 where id =1
            *
ERROR at line 1:
ORA-08177: can't serialize access for this transaction

报错信息已经提示的很明显了
原因:更新行已经在其他的会话中进行了修改,版本不一致

 

 

 

 

参考:http://www.cnblogs.com/jackal/archive/2011/02/14/1954231.html

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

转载于:http://blog.itpub.net/195110/viewspace-717924/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值