事务隔离级别

来源:互联网 发布:php支付宝扫码demo 编辑:程序博客网 时间:2024/06/08 14:18

需要防止的现象和事务隔离级别

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以结束整个事务。

原创粉丝点击