首页 > 范文大全 > 正文

ORACLE 事务处理机制探析

开篇:润墨网以专业的文秘视角,为您筛选了一篇ORACLE 事务处理机制探析范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:在oracle数据库中,为了确保数据的完整性和一致性,提供了事务处理机制。该文详细阐述了事务处理的运行机制和实现方法,最后用实例说明事务处理的整个过程,为程序员提供了一个用事务处理来保证数据正确统一的方法。

关键词:事务处理;提交;回滚;保存点

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)15-3466-02

在ORACLE的PL/SQL程序设计过程中,经常会使用DML语句来操作数据库,怎么才能确保数据库不会因为意外或者误操作损坏数据呢,以员工管理系统为例,其中有一张部门表和一张员工表,当我们删除某个部门时,应该先删除这个部门所有的员工,如果员工表没有删除成功而部门表中成功删除,就破坏了数据,造成数据库统计错误。同样的道理,添加员工时,如果这个员工的部门不存在而添加成功,也会造成统计错误,使数据库的数据变得混乱,影响此系统的正常运行,ORACLE为了确保数据的完整性和一致性,所以引入了事务处理的机制。

1 事务处理详述

是由多个SQL语句组合成一起组成的逻辑工作单元,它负责执行一系列对数据的操作。 这些对数据库的所有操作如果全部成功完成,则永久更新,否则,只要有一条SQL语句执行失败,就不会更新当前数据,而会回滚到执行前的状态。这样,就能使数据库保持完整性和一致性,不会产生错误的数据。事务处理所组成的逻辑工作单元为了保证数据的一致性,那么其中每一个逻辑工作单位就必须要满足ACID属性,即原子性、一致性、隔离性和持久性。

1.1 原子性

原子性其实就是对事务的一个完整性操作,就好比一段顺序执行的程序,要么全部执行完成,要么不执行。如果执行到中途遇到错误,则停止并且回到执行前的状态。例如在个人帐户管理中,A帐户支出500元给B帐户,那么A帐户就应该减少500元,B帐户就应该增加500元,这个操作要么全部执行成功,要么都不成功,这样来确保这个事务是一个原子工作单位。

1.2 一致性

事务的一致性是指在事务完成的时候,对数据的相关操作在受影响的数据表的数据都会同时进行更新,保持数据的一致状态。就如在刚才的例子当中,A帐户和B帐户在数据库中每个表中的状态都会同时发生改变,来保持数据的完整性。

1.3 隔离性

不同事务之间的运行是互不干扰的,是完全隔离执行的,一个事务不会看到另一个事务发生的状态,也看不到中间状态的数据。事务查看到的只能是数据修改前或或务执行成功更新后的状态。就如刚才的事例,要么看到A帐户到B帐户支出前的数据或者成功支出后的数据,对于A帐户支出后,B帐户没有执行完成的状态是看不到的。这就是事务的隔离性。

1.4 持久性

事务的持久性是指如果一个事务已经成功提交后,数据库中的数据就会成功更新,这种更新会永久的保存,即使系统遇到故障甚至机器崩溃,也不会影响数据库的状态。

2 提交事务(COMMIT)

在事务处理过程中,使用COMMIT语句会提交并结束一个事务处理。当执行COMMIT语句后,数据库的事务处理主要做了两项工作:第一是将所有对数据库的操作永久性的写入数据库,其他的用户可以立即看到对数据库所做的所有变化;第二是对于本事务的所有锁定以及事务所占用的所有资源都会被自动的释放出来,并且将此事务标记为已完成。

3 回滚事务(ROLLBACK)

事务的回滚就是取消已执行的操作,并且回到操作前的状态。例如在前面的例子中,A帐户成功执行了支出500元的操作,但遇了一些错误或问题,B帐户并没有增加金额,这是回滚就会撤消刚才的操作,回到A帐户支出前的数据,并且终止事务的执行。事务的回滚一般也是有两种情况:第一是数据的误删除或误更改来使用回滚撤消;第二是事务程序中设置的异常被触发,使用回滚恢复到数据初始状态。

4 事务的保存点(SAVEPOINT)

事务的保存点主要用于回滚部分事务。因为在一个很大的PL/SQL程序设计过程中,如果执行了很多的语句,使用回滚是非常占用时间和资源的。保存点可以在一个很大的程序中将一个事务分成很多语句块,将每一块设置为一个保存点,一旦程序发生错误,就会回滚到最近的保存点。在不可能发生错误的情况下,保存点很有用。在很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效。更新和回滚操作代价很大,因此只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存点才会非常有效。

5 设置事务属性(SET TRANSACTION)

SET TRANSACTION主要是用来设置一个事务的只读或只写的属性,建立隔离的级别以及为当前的事务分配一个特写的回滚段。它必须是事务处理中的第一条语句,而且只能出现一次。

6 事务处理的实例解析

下面的PL/SQL程序演示了事务的提交、回滚和保存点的实际使用方法。程序中使用了一个疗养院信息管理系统的科室表(DEPT)和疗养员入院登记表(PAT_VISIT)。例子中为了简化,只列出部分字段,其中DEPT表中有DEPT_CODE科室代码,DEPT_NAME科室名称,INPUT_CODE检索码;PAT_VISIT表中有DEPT_CODE入院科室,PAT_NAME患者姓名,SEX性别,AGE年龄。

DECLARE

DEPT_CODE NUMBER(4):=1010; —定义部门编号保存变量

BEGIN

—事务开始

SAVEPOINT A; —保存点A

INSERT INTO DEPT VALUES (DEPT_CODE,'口腔科','KQK'); —插入科室记录

SAVEPOINT B; —保存点B

INSERT INTO PAT_VISIT VALUES (DEPT_CODE,'张三','男',33); —插入患者入院记录

SAVEPOINT C; —保存点C

INSERT INTO DEPT VALUES (DEPT_CODE,'心理科','XLK'); —插入相同编号的科室记录

COMMIT; —提交事务

EXCEPTION —异常处理模块

WHEN DUP_VAL_ON_INDEX THEN —捕获异常

DBMS_OUTPUT.PUT_LING('不能插入相同编号的科室记录'); —显示异常信息

ROLLBACK TO B; —回滚到指写的保存点

END;

程序的执行情况说明:

1)程序在开始的时候定义了第一个保存点A,在第二个插入和第三个插入点分别定义了保存点B和保存点C。

2)保存点C执行的语句违反了主键的唯一约束条件,于是触发了异常,在异常的语句中,设置了回滚到保存点B的命令,所以插入科室记录应该是成功的,而插入患者的操作会被回滚。当程序执行完成后,我们查看数据表的数据,发觉口腔科已被正确插入到DEPT表中,而患者记录并没有入到PAT_VISIT表中。

在实际的事务处理运用中,要处理的数据量和复杂程度都要比这个大得多,这只是简单的说明了一下事务处理的过程,只有正确的运用事务处理机制,才能更好的防止数据出现混乱,并且保持数据的一致性和完整性。

参考文献:

[1] 王健,秦海龙. Oracle基于事务日志的数据恢复[J].内蒙古农业大学学报:自然科学版,2006(4).

[2] 刘大勇.利用Oracle的闪回功能恢复偶然丢失的数据[J]. 计算机与信息技术,2005(6).

[3] 林烈青.基于事务日志的数据库恢复机制研究[J].现代计算机:专业版,2009(8).

[4] 龚松杰. Web服务事务处理模型研究[J].计算机工程,2007(10).