隔离级别(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/