需要防止的现象和事务隔离级别
ANSI/ISO SQL 标准(SQL92)定义了四种事务隔离级别(transaction isolation level),这四种隔离级别所能提供的事务处理能力各不相同。这些事务隔离级别是针对三种现象定义的,在并发事务执行时,需要阻止这三种现象 中的一种或多种发生。
三种需要阻止的现象(preventable phenomena)是:
* 脏读取(dirty read):一个事务读取了被其他事务写入但还未提交的数据。
* 不可重复读(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。
* 不存在读(虚读)(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。
SQL92 标准中定义了四个隔离级别,在各隔离级别中,允许发生上述三种需要阻止的现象中的一种或多种。详细情况如下:
各隔离级别中允许出现的需要防止的读取现象
隔离级别 脏读取 不可重复读取 不存在读取
读未提交 允许 允许 允许
(read uncommitted)
读已提交 不允许 允许 允许
(read committed)
可重复读 不允许 不允许 允许
(repeatable read)
串行化 不允许 不允许 不允许
(SERIALIZABLE)
Oracle 支持三种事务隔离级别:已提交读取,串行化,以及 SQL92 中没有包含的只读模式(read-only mode)。已提交读取是 Oracle 默认使用的事务隔离级别。
oracle常常使用语句级(state-level)一致性,保证数据在语句的生命期之间是可见的但不能被改变。事务由多个语句组成,当使用事务时,事物级(transaction-level)一致性在整个事务生命期中保证数据对所有语句都是可见的。
oracle通过SCN(syatem change number)实施一致性。一个SCN是一个面向时间的数据库内部键。SCN只会增加不会减少,SCN表示了时间上的一个点,每个数据块都有一个SCN,通过比较这个点实施操作。
事务级一致性
SET TRANSACTION 的一个作用是确保事务级一致或语句级一致中有一个实施。ORACLE使用这些术语:
ISOLATION LEVEL READ COMMITTED 表示语句级一致
ISOLATION LEVEL SERIALIZABLE 表示事务级一致。
例:
设置隔离级别
1、设置一个事务的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2、设置增个会话的隔离级别
ALTER SESSION SET ISOLATION_LEVEL= READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL= SERIALIZABLE;
下面的语句也能确保事务级一致:
SET TRANSCATION READ ONLY
任何企图在只读(READ ONLY)事务中修改数据的操作都会抛出一个异常。但是,READ ONLY事务只能在下列语句中使用:
SELECT(没有FOR UPDATE子句)
LOCK TABLE
SET ROLE
ALTER SYSTEM
ALTER ALARM
即使没有改变任何数据,READ ONLY事务依然必须使用一个COMMIT或ROLLBACK以结束整个事务。