oracle中事务处理--事务隔离级别
概念:隔离级别定义了事务与事务之间的隔离程度。
ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而以,不同的数据库在实现时有所不同)。
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交(Read uncommitted) |
√ |
√ |
√ |
读已提交(Read committed) |
× |
√ |
√ |
可重复读(Repeatable read) |
× |
× |
√ |
可串行化(Serializable) |
× |
× |
× |
√可能出现,×不会出现
事务隔离级别
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
在oracle中没有脏读的问题。
不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时产生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
oracle的事务隔离级别
oracle提供了sql92标准中的read committed(读已提交)和serializable(可串行化),同时提供了非sql92标准的read-only(读一致性)
oracle的read committed读已提交说明:
1、这里oracle缺省的事务隔离级别;
2、保证不会脏读,但可能出现非重复读和幻读。
oracle的serializable可串行化说明:
1、serializable就是使事务看起来象是一个接着一个地顺序地执行(从效果上可以这样理解);
2、仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改;
3、保证不会出现脏读、不可重复读和幻读;
4、serializable隔离级别提供了read-only事务所提供的读一致性(事务的读一致性),同时又允许DML(update/insert/delete)操作
oracle的read only读一致性说明:
1、遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改;
2、不允许在本事务中进行DML(insert/update/delete)操作;
3、read only是serializable的子集。它们都避免了不可重复读和幻读。区别是在read only中是只读;而在serializable中可以进行DML操作。
如何把oracle的事务隔离级别设置为serializable(可串行化)?
set transaction isolation level serializable;(将事务隔离级别设成为“可串行化”)
oracle的事务隔离设置
设置一个事务的隔离级别
set transaction isolation level read committed;(oracle默认的事务隔离级别“读已提交”)
set transaction isolation level serializable;(设置事务隔离级别为“可串行化”)
set transaction read only;(设置事务隔离级别为“读一致性”)
设置整个会话的隔离级别
alter session set isolation_level serializable;(设置会话为“可串行化”)
alter session set isolation_level read committed;(设置会语为“读已提交”)
只读事务实际运用案例
只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务.在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
设置只读事务
set transaction read only