Oracle-事务隔离级别

本文介绍了事务隔离级别的概念及其对并发性和性能的影响,并详细解释了ANSI/ISOSQL92标准定义的四种隔离级别:序列化、可重复读、读已提交和读未提交。此外,还介绍了Oracle数据库支持的隔离级别及如何查询和修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隔离级别(isolation level),是指事务与事务之间的隔离程度。

 

显然,事务隔离程度越高,并发性越差、性能越低;事务隔离程度越低,并发性越强、性能越高。

 

ANSI/ISO SQL92标准中定义了4种事务隔离级别:

 

1.       序列化(serializable)

最高隔离级别。系统中所有的事务都是一个接一个执行的。因此也就不会发生任何事务之间的冲突问题。

 

2.       可重复读(repeatable read)

一个事务所读取的数据记录不允许被其他事务所修改。

 

3.       读已提交(read committed)

该级别允许其他事务修改当前事务所读取的数据记录,并且那个事务提交之后,当前事务可以看到修改后的数据。

 

4.       读未提交(read uncommitted)

该级别允许其他事务修改当前事务所读取的数据记录,并且那个事务尚未提交时,当前事务就可以看到修改后的数据。即允许脏读。

 

事务隔离级别不同,执行一条数据库查询,得到的结果很可能让你感到意外,下面是这些情况的总结:

 

1.       脏读

读取了其他事务还没有提交的数据。

 

2.       不可重复读

当前事务已经读取的数据记录,被其他事务修改或删除。

 

3.       幻影读

其他事务插入了新的数据,当前事务以相同的查询条件,在那个事务插入数据之前和之后查询数据,得到的数据记录的条数不一样。

 

隔离级别

脏读

不可重复读

幻影读

序列化

N

N

N

可重复读

N

N

Y

读已提交

N

Y

Y

读未提交

Y

Y

Y

 

Oracle明确支持ANSI/ISO SQL92中定义的serializable和read committed两种事务隔离级别。

 

同时,Oracle还提供了自己独有的事务隔离级别:read only。

 

所以,可以说Oracle共支持3种事务隔离级别:

 

1.       serializable

2.       read committed

3.       read only

 

Oracle默认的隔离级别是read committed。

查看数据库隔离级别的方法:

1.  SELECT * FROM dual FOR UPDATE;

2. SELECT s.sid, s.serial#,
   CASE BITAND(t.flag, POWER(2, 28))
          WHEN 0 THEN 'READ COMMITTED'
          ELSE 'SERIALIZABLE'
       END AS isolation_level
    FROM v$transaction t
    JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

修改数据库隔离级别的方法:

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

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

转载于:http://blog.itpub.net/29440247/viewspace-1107190/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值