并发性与隔离级别

 

一、并发性带来的问题
  1、脏读(dirty read)
  2、幻读(phantom read)
  3、更新丢失(lost update)
  4、不可重复读(nonrepeatable read)
二、隔离级别
  1、串行(serializable):不会出现任何并发性问题
  2、可重复读(repeatable read):可能出现幻读
  3、已提交读(read committed):可能出现幻读和不可重复读,解决了脏读和更新丢失。
  4、未提交读(read uncommitted):可能出现所有并发性问题
  隔离级别越高,并发性越差,一致性越好。
三、oracle提供的隔离级别
  1、串行(serializable)
  2、已提交读(read committed)(oracle默认隔离级别)
  3、只读模式(read only)

四、语句级读一致性
  语句级读一致性(statement-level read consistency):单一查询的结果集来自一个时间点——即查询开始执行的时间。一个查询的结果集永远不会包含脏数据及此查询执行

时其他事务提交的数据。在一个查询执行期间,只有在查询执行前提交的数据对此查询才是可见的。查询无法看到其开始执行后提交的数据。
  SELECT ,使用子查询的 INSERT、UPDATE、DELETE 语句,都能够保证数据一致性。
  INSERT、UPDATE、DELETE 语句中包含的查询能够获得一致性的结果集。这些查询无法看到其所在 DML 语句对数据的修改。换句话说,这些查询只能看到其所在 DML 语句开始之

前的数据。
  如果 SELECT 列表中存在 PL/SQL 函数,那么函数中包含的 SQL 语句将遵从其自身的语句级读一致性,而非其所在 SQL 的读一致性。
  oracle默认保证语句级读一致性。
五、事务级读一致性
  事务级读一致性(transaction-level read consistency:事务内所有数据访问均反映的是事务开始时的数据状态。即事务内的所有查询对某个时间点来说具备一致性,但是运

行在串行化模式下的事务能够看到事务自身对数据所作的修改。事务级的读一致性能够保证可重复读取并可阻止出现不存在读取。在oracle中实现事务级读一致性需要修改隔离级

别,设置为serializable。
六、更改隔离级别
  1、会话级修改:alter session set isolation_level={serializable |read committed}  --会话级修改只有这两个值
  2、事务级修改:set transaction isolation level {serializable |read committed}
                 set transaction read only
                 --事务级修改有三个取值,但修改语句只能是事务的第一个语句。
                 --sys用户或者以sysdba连接的用户不能在事务级设置串行隔离级别

你可能感兴趣的:(事务管理)