93.Oracle数据库SQL开发之 修改表内存——数据库事务的事务隔离级别

241 阅读2分钟

93.Oracle数据库SQL开发之 修改表内存——数据库事务的事务隔离级别

欢迎转载,转载请标明出处:blog.csdn.net/notbaron/ar…\

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

在两个并发事务T1和T2正在访问相同的行,这几个例子可以展示出事务处理中可能存在的三种问题:

1.  幻象读取(phantom read)

事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用查询中的WHERE子句的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻象”。

2.  不可重复读取(nonrepeatabl read)

事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录的内容。然后T1又再次读取这一行记录,发现它与刚才读取的结果不同了。这种现象称为“不可重复”读,因为T1原来读取的那一行记录已经发生了变化。

3.  脏读(dirty read)

事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取更新后的行。然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了(称为脏数据)。因为在T2读取这行记录时,T1所做的修改并没有提交。

 

为了处理这些可能出现的问题,数据库实现了不同级别的事务隔离性,以防止并发事务会相互影响。

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

READ COMMITTED 允许幻象读和不可重复读,但是不允许脏读

REPEATABLE READ 允许幻象读,但是不允许不可重复读和脏读

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

ORACLE数据库支持READ COMMITTED 和SERIALIZABLE两种事务隔离性级别,不支持READUNCOMMITTED和REPEATABLE READ这两种隔离性级别。

ORACLE数据库默认使用的事务隔离性级别确实READCOMMITTED,几乎对于所有应用程序来说都是可以接受的。

事务隔离性级别可以使用SET TRANSACTION语句设置。例如,下面这个语句将事务隔离性级别设置为SERIALIZABLE:

Set transaction isolation levelserializable;