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不仅允许回退整个未提交的事务,还允许回退事务的一部分,这个可以通过“保存点”来完成。在事务的执行过程中,用户可以通过建立保存点将一个较长的事务分隔为几部分。这样用户就可以有选择性的回退到某个保存点,并且该保存点之后的操作都将被撤销。
² 基本语法:
savepoint 保存点名称
………………
Rollback to 保存点名称 或 rollback --撤销全部事务
² 说明:
(1) 一个事务中可以保存多个保存点,不能2次回退到同一保存点,一旦回退过一次,保存点就失效了。
(2) 保存点的设置代价是有资源开销的。
(3) 一旦提交了事务,则不能回退到任何保存点。
5、 事务隔离级别
² 说明:事务隔离级别由国际标准化组织定义,不是所有的DBMS都遵循。
² 简介:事务隔离级别定义了事务与事务之间的隔离程度。隔离级别与并发性是相互矛盾的。隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
² 并发操作引起的错误
(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; --两次查询的记录不同
² 事务隔离级别的概念:隔离级别定义了事务与事务之间的隔离程度
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交(read uncommitted) |
√ |
√ |
√ |
读已提交(read committed) |
× |
√ |
√ |
可重复读(repeatable read) |
× |
× |
√ |
可串行化(serializable) |
× |
× |
× |
6、Oracle的事务隔离级别
Oracle提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。read-only是serializable的子集,它们都避免了非重复读和幻读,区别是read-only中不允许sql进行DML操作。
² Oracle的readcommitted说明
(1) 这是oracle缺省的事务隔离级别
(2) 保证不会脏读:但可能出现不可重复读和幻读
² Oracle的serializable说明
(3) 使事务看起来像是一个接着一个顺序的执行
(4) 仅仅能看到本事务开始前由其他事务提交的更改和在本事务中所做的更改
(5) 保证不会出现脏读、不可重复读和幻读
(6) 提供了read-only事务所提供的读一致性,同时又允许DML操作
² 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、可串行化
² 介绍:可串行化就是使事务看起来像是一个接着一个顺序执行。事务在开始前对数据库中的所有数据拍了一个快照,在事务执行过程中仅能看到这个快照中的数据和在本事务中所做的更新。
注意:sys用户不能运行Set transaction isolation level serializable。
² 举例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:
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; --没有发生幻读,插入记录对其没起作用