日期:2014-05-16  浏览次数:20645 次

oracle简单学习总结(六)——数据库事务

一、概念

事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。

二、理解

我们去银行转账,操作可以分为下面两个环节:
(1) 从第一个账户划出款项。
(2) 将款项存入第二个账户。

在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。数据库事务是一个逻辑上的划分,有的时候并不是很明显,它可以是一个操作步骤,也可以是多个操作步骤。

理解数据库事物:

对数据库所做的一系列修改,在修改过程中,暂时不写入数据库,而是缓存起来,用户在自己的终端可以预览变化,直到全部修改完成,并经过检查确认无误后,一次性提交并写入数据库,在提交之前,必要的话所做的修改都可以取消。提交之后,就不能撤销,提交成功后其他用户才可以通过查询浏览数据的变化。

三、优点

1. 把逻辑相关的操作分成了一个组。

2. 在数据永久改变前,可以预览数据变化。

3.能够保证数据的读一致性

四、应用

数据库事务处理可分为隐式和显式两种。

1、显式事务:操作通过命令实现

2、隐式事务:由系统自动完成提交或撤销(回退)工作,无需用户的干预。

隐式提交的情况包括:

1、当用户正常退出SQL*Plus或执行CREATE、DROP、GRANT、REVOKE等命令时会发生事务的自动提交。

2、还有一种情况,如果把系统的环境变量AUTOCOMMIT设置为ON( 默认状态为OFF) , 则每当执行一条INSERT 、DELETE 或UPDATE命令对数据进行修改后,就会马上自动提交。设置命令格式如下:
SET AUTOCOMMIT ON/OFF
隐式回退的情况包括:当异常结束SQL*Plus或系统故障发生时,会发生事务的自动回退。

显式事务处理的数据库事务操作语句有3条

语 句  描 述
COMMIT 数据库事务提交,将变化写入数据库
ROLLBACK 数据库事务回退,撤销对数据的修改
SAVEPOINT 创建保存点,用于事务的阶段回退

COMMIT操作把多个步骤对数据库的修改,一次性地永久写入数据库,代表数据库事务的成功执行。

ROLLBACK操作在发生问题时,把对数据库已经作出的修改撤消,回退到修改前的状态。在操作过程中,一旦发生问题,如果还没有提交操作,则随时可以使用ROLLBACK来撤消前面的操作。

SAVEPOINT则用于在事务中间建立一些保存点

ROLLBACK可以使操作回退到这些点上边,而不必撤销全部的操作。一旦COMMIT完成,就不能用ROLLBACK来取消已经提交的操作。一旦ROLLBACK完成,被撤消的操作要重做,必须重新执行相关操作语句。

五、开始

一般情况下,开始一个会话(即连接数据库),执行第一条SQL语句将开始一个新的事务,或执行COMMIT提交或ROLLBACK撤销事务,也标志新的事务的开始。另外,执行DDL(如CREATE)或DCL命令也将自动提交前一个事务而开始一个新的事务。

示例:

第一步:查询所有表数据

第二步:插入一条数据(id=14那条)

第三步:插入保存点,检查点的名称为PA:

第四步:插入另一条数据(id=15那条)

第五步:再插入保存点,检查点的名称为PA1:

第六步:展示数据

insert into AZJuserInfor values (abc.nextval,'张四',to_date('2012-02-13','yyyy:MM:dd'),0,1); 
SAVEPOINT pa;
insert into AZJuserInfor values (abc.nextval,'张四儿',to_date('2012-02-13','yyyy:MM:dd'),10,1); 
select t.*, t.rowid from azjuserinfor t order by id;
SAVEPOINT pa1;
se