Oracle 存储过程中的事务处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle存储过程中的事务处理

当在SQL*Plus中进行操作时,用户可以使用COMMIT语句将在事务中的所有操作“保存”到数据库中。如果用户需要撤销所有的操作,则可以使用ROLLBACK语句回退事务中未提交的操作,使数据库返回到事务处理开始前的状态。在PL/SQL过程中,不仅可以包括插入和更新这类的DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。

Oracle支持事务的嵌套,即在事务处理中进行事务处理。在嵌套的事务处理过程中,子事务可以独立于父事务处理进行提交和回滚。对于过程而言,每个过程就相当于一个子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是回滚,用户都可以确保过程中的子事务被执行。

下面通过一个示例演示过程中的事务处理。

(1)以用户SCOTT身份连接到数据库,并建立两个表TEMP和LOG_TABLE。

SQL> create table temp(n number);

表已创建。

SQL> create table log_table(

2 username varchar2(20),

3 message varchar2(4000));

表已创建。

(2)建立一个存储过程INSERT_INTO_LOG,用于向表LOG_TABLE添加记录。

SQL> create or replace procedure insert_into_log(msg_param varchar2) is

2 pragma autonomous_transaction;

3 begin

4 insert into log_table(username,message)

5 values(user,msg_param);

6 commit;

7 end insert_into_log;

8 /

过程已创建。

其中,PRAGMA AUTONOMOUS_TRANSACTION语句表示自动开始一个自治事务,实际上该语句也可以省略。

(3)在匿名程序块中调用INSERT_INTO_LOG过程向LOG_TABLE表中添加数据,并使用INSERT语句向表TEMP添加数据。

SQL> begin

2 insert_into_log('添加数据到TEMP表之前调用');

3 insert into temp

4 values(1);

5 insert_into_log('添加数据到TEMP表之后调用');

6 rollback;

7 end;

8 /

PL/SQL 过程已成功完成。

由于在INSERT_INTO_LOG过程中使用COMMIT语句提交了过程中的事务,因此当匿名程序块中的父事务回滚时,存储过程已经向LOG_TABLE表提交了添加的数据。这里需要注意,如果在中间使用INSERT语句添加数据,那么该INSERT语句是否会随子过程中事务的提交而被提交呢?下面对表中的数据进行分析:

SQL> select * from temp;

未选定行

SQL> select * from log_table;

USERNAME MESSAGE

-------------------- --------------------------------------

SCOTT 添加数据到TEMP表之前调用

SCOTT 添加数据到TEMP表之后调用

从结果中可以看出,在TEMP表中并没有记录,这说明INSERT语句被撤销了。而在表LOG_TABLE中则包含了两条记录,这说明过程中的子事务已经被提交。即过程中的子事务与调用父事务可以互相不干涉地运行。

相关文档
最新文档