一、并发性带来的问题
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连接的用户不能在事务级设置串行隔离级别