Oracle 事物隔离级别

1、事务介绍

Oracle11g中的事务是隐式自动开始的,不需要用户显示的执行开始事务语句。但对于事务的结束处理,则需要用户进行指定的操作。通常在以下情况下,Oracle认为一个事务结束了。

(1)  执行Commit语句提交事务

(2)  执行Rollback语句撤销事务

(3)  执行一条数据定义语句。如果该语句执行成功,那么oracle系统会自动执行commit命令;否则,系统会自动执行Rollback命令。

(4)  执行一个数据控制命令,当语句执行完毕,oracle系统会自动执行commit命令。

(5)  正常的断开数据库的连接、正常的退出sqlplus环境,那么oracle系统会自动执行commit命令;否则,系统会自动执行Rollback命令。

2、Commit语句

Commit代表提交事务,oracle系统内部会按照如下顺序进行处理:

(1)  首先在回滚段内记录当前事务已提交,并且声明一个唯一的系统编号(SCN),以唯一标识这个事务。

(2)  然后启动后台的日志写入进程(LGWR),将SGA区的重做日志缓冲区中的数据和当前事务的SCN写入重做日志文件中。

(3)  接着Oracle服务器开始释放事务处理所使用的系统资源。

(4)  最后显示通知,告诉用户事务已经成功提交完毕。

3、Rollback语句

Rollback代表撤销事务,oracle系统内部会按照如下顺序进行处理:

(1)   首先使用回滚段中的数据撤销对数据库所做的修改。

(2)   然后Oracle后台服务器进程释放掉事务所使用的系统资源。

(3)   最后显示通知,告诉用户事务已经撤销成功。

4、保存点

Oracle不仅允许回退整个未提交的事务,还允许回退事务的一部分,这个可以通过“保存点”来完成。在事务的执行过程中,用户可以通过建立保存点将一个较长的事务分隔为几部分。这样用户就可以有选择性的回退到某个保存点,并且该保存点之后的操作都将被撤销。

2     基本语法:

savepoint 保存点名称

………………

Rollback to 保存点名称  或  rollback --撤销全部事务

2     说明:

(1)         一个事务中可以保存多个保存点,不能2次回退到同一保存点,一旦回退过一次,保存点就失效了。

(2)         保存点的设置代价是有资源开销的。

(3)         一旦提交了事务,则不能回退到任何保存点。

5、 事务隔离级别

2     说明:事务隔离级别由国际标准化组织定义,不是所有的DBMS都遵循。

2     简介:事务隔离级别定义了事务与事务之间的隔离程度。隔离级别与并发性是相互矛盾的。隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

2     并发操作引起的错误

(1)         脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。(oracle中无此现象)

(2)         不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读。

例如:

Insert into emp(empno,ename) values(9000, ‘李明‘)

Sqlplus  2: select * from emp;

Sqlplus  1: delete from emp where empno=9000

Commit

Sqlplus 2: select * from emp; --两次查询的记录不同

(3)         幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。

例如:

Sqlplus  2: select * from emp;

Sqlplus 1:  Insert into emp(empno, ename)values(9999, ‘李亮‘);

Commit;

Sqlplus 2: select * from emp; --两次查询的记录不同

2  事务隔离级别的概念:隔离级别定义了事务与事务之间的隔离程度


隔离级别


脏读


不可重复读


幻读


读未提交(read uncommitted)





读已提交(read committed)


×




可重复读(repeatable read)


×


×



可串行化(serializable)


×


×


×

6、Oracle的事务隔离级别

Oracle提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。read-only是serializable的子集,它们都避免了非重复读和幻读,区别是read-only中不允许sql进行DML操作。

2     Oracle的readcommitted说明

(1)         这是oracle缺省的事务隔离级别

(2)         保证不会脏读:但可能出现不可重复读和幻读

2     Oracle的serializable说明

(3)         使事务看起来像是一个接着一个顺序的执行

(4)         仅仅能看到本事务开始前由其他事务提交的更改和在本事务中所做的更改

(5)         保证不会出现脏读、不可重复读和幻读

(6)         提供了read-only事务所提供的读一致性,同时又允许DML操作

2  Oracle的事务隔离级别设置

(1)         设置一个事务的隔离级别

Set transaction isolation level readcommitted; --(默认)

Set transaction isolation levelserializable; --代价比较高昂

Set transaction read only;

(2)         设置整个会话的隔离级别

Alter session set isolation_level=serializable;

Alter session set isolation_level=readcommitted;

7、可串行化

2  介绍:可串行化就是使事务看起来像是一个接着一个顺序执行。事务在开始前对数据库中的所有数据拍了一个快照,在事务执行过程中仅能看到这个快照中的数据和在本事务中所做的更新。

注意:sys用户不能运行Set transaction isolation level serializable。

2  举例1:

Sqlplus  2:  Settransaction isolation level serializable; --用commit保证它是事务第一条语句

Select * from emp;

Sqlplus  1: select * from emp;

Delete from emp where empno=9999;

Commit;

Select * from emp;

Sqlplus  2: Select * from emp; --没有发生不可重复读,删除记录对其没起作用

2  举例2:

Sqlplus  2:  Settransaction isolation level serializable;

Select * from emp;

Sqlplus  1: select * from emp;

Insert into emp(empno, ename)values(9998, ‘王明‘)

Commit;

Select * from emp;

Sqlplus  2: Select * from emp; --没有发生幻读,插入记录对其没起作用

Oracle 事物隔离级别

时间: 2024-10-12 21:03:17

Oracle 事物隔离级别的相关文章

JDBC ORACLE 数据库隔离级别

数据库的隔离级别: 于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的. 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了. 幻读: 对于两对个事物 T1, T2, T1 从一个表中读取了一个字

事物及事物隔离级别

什么是事物 事物是访问数据库的一个操作序列,数据库应用系统通过事物集来完成对数据库的存取.事物的正确执行使得数据库从一种状态转换为另一种状态. 事物必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isolation).持久性(durability)的缩写,这四种状态的意思是: 1.原子性 即不可分割,事物要么全部被执行,要么全部不执行.如果事物的所有子事物全部提交成功,则所有的数据库操作被提交,数据库状态发生变化:如果

Oracle事务隔离级别处理差异

Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZABLE,解决脏读.不重复读.幻读两个事务同时update相同记录时,第一个事务可执行,第二个事务阻塞,当第一个事务提交后,第二个事务抛出异常如图1.当第一个事务回滚后,第二个事务继续执行. 图1 Oracle事务隔离级别READ_COMMITTED,解决脏读两个事务同时update相同记录时,第一个事

Oracle事务隔离级别

oracle隔离级别 只有READ COMMITTED和 SERIALIZABLE 因为当有人对数据库的数据进行任何写操作(DML操作)时,Oracle数据库系统首先将原始的数据复制到回滚段中,之后才做相应的操作,在事务处理结束之前其他的用户可以读这些数据,但是读到的都是回滚段上的数据. 参考http://www.cnblogs.com/friends-wf/p/3746348.html Oracle事务隔离级别

数据库的事物隔离级别以及锁的一些个人理解

数据库的 基本分为 共享锁和排它锁 排它锁顾名思义,不能和其他任何所共存. 以SqlServer中某一行数据为例, 特殊的,WithNoLock 这个是不给数据加上任何锁,所以根本和锁没关系 再说update,update的过程是给这条数据加上排它锁,所以当另外事物过来要求修改这条数据的时候,会由于排它锁的互斥,导致无法申请到排它锁,从而实现同一时间只有一个事物对同一条数据进行修改.同样当该条数据正在修改中但其所属的事物还未提交的时候,查询需要在这条数据上加上共享锁的过程也由于排它锁的存在导致被

事物隔离级别_悲观与乐观锁

  1.我印象中的事物事务是一种机制,它确保多个SQL语句被当作完整的操作单元来处理,所有的操作都完成时统一提交. 2.关系数据库的事务特性(ACID) ACID:原子性: 事务是数据库的逻辑工作单位,而且必须是原子工作单位,对于修改,要么全部执行,要么全部不执行        一致性:事务在完成时,必须是所有的数据都保持一致状态. 隔离型: 一个事务的执行不能被其他事务所影响.事务必须是互相隔离的,防止并发读写同一个数据的情况发生 持久性: 一个事务一旦提交,事物的操作便永久性的保存在DB中.

Mysql 查看及设置事物隔离级别

1.查看 SELECT @@tx_isolation 2.设置 2.1所有级别 1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决 2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的 3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的 4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表 2.2 设置 设置mysql的隔离级别:se

oracle 数据库隔离级别

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度. 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1.幻想读:事务T1读取一条指定where条件的语句,返回结果集.此时事务T2插入一行新记录,恰好满足T1的where条件.然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想. 2.不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读. 3.脏读:事

Hibernate 事物隔离级别 深入探究

目录 一.数据库事务的定义 二.数据库事务并发可能带来的问题 三.数据库事务隔离级别 四.使用Hibernate设置数据库隔离级别 五.使用悲观锁解决事务并发问题 六.使用乐观锁解决事务并发问题 Hibernate事务与并发问题处理(乐观锁与悲观锁) 一.数据库事务的定义 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功