?Oracle存储过程中的事务是如何处理的?通常情况下。整个过程是作为一个事务整体被提交或回滚的,这属于数据库的基本知识,这里简单说明:
??1通常情况
通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。?
如下例所示:
例1
- SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 13:24:22 2012
- Copyright (c) 1982, 2010, Oracle.??All rights reserved.
- 请输入用户名:??SYSTEM
- 输入口令:
- 连接到:
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL> CREATE TABLE T1 (C INT,D INT NOT NULL);
- 表已创建。
- SQL> create or replace procedure pt1 is begin
- ??2? ? insert into t1 values(1,1);
- ??3? ? INSERT INTO T1 VALUES(2,NULL);
- ??4? ? end;
- ??5??/
- 过程已创建。
- SQL> CALL PT1();
- CALL PT1()
- ? ???*
- 第 1 行出现错误:
- ORA-01400: 无法将 NULL 插入 ("SYSTEM"."T1"."D")
- ORA-06512: 在 "SYSTEM.PT1", line 3
- ?
- SQL> SELECT * FROM T1;
- 未选定行
在这个例子中,我们构造了D列不允许为空的表,并故意在过程中执行一个违反约束的插入语句,造成过程调用的回滚操作,最终通过查询表T1,我们发现执行过程的时候,整个过程内的2条INSERT语句都被回滚了。这证明了在通常情况下,存储过程是作为一个事务整体的。
另一方面需要说明的是,在非自动提交的情况下,存储过程除非内部显式的执行了commit操作,否则即便整个过程执行成功,当前事务也是未提交的,这是存储过程的另一个特点:存储过程并不会自动提交。?例子如下:
例2
- SQL> create or replace procedure pt1 is begin
- ??2? ? insert into t1 values(1,1);
- ??3? ?-- INSERT INTO T1 VALUES(2,NULL);
- ??4? ? end;
- ??5??/
- 过程已创建。
- SQL> select * from t1;
- 未选定行
- SQL> call pt1();
- 调用完成。
- SQL> select * from t1;
- ? ?? ?? ?C? ?? ?? ? D
- ---------- ----------
- ? ?? ?? ?1? ?? ?? ? 1
- SQL> commit; --在这里显式提交
- 提交完成。