过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com
Oracle 事务原子性的实验
上一篇 /
下一篇 2007-12-26 22:06:52
/ 个人分类:Oracle数据库技术-PL/SQL
以下均为实验结果很清楚,不做过多说明了:)
1.语句级的原子性质
---------------------------
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 9.2.0.8.0 - Production on 星期三 12月 26 22:00:31 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connhujinpei/passw0rd@icmnlsdb
已连接。
SQL> create table t2 (count int);
表已创建。
SQL> insert into t2 values (0);
已创建 1 行。
SQL> commit;
提交完成。
SQL> create table t1 (x int check(x>0));
表已创建。
SQL> create trigger t_trigger
2 before insert or delete on t1 for each row
3 begin
4 if ( inserting ) then
5 update t2 set count=count+1;
6 else
7 update t2 set count=count-1;
8 end if;
9 dbms_output.put_line('Fired '||sql%rowcount||' rows');
10 end;
11 /
触发器已创建
SQL> set serveroutput on
SQL> insert into t1 values (1);
Fired 1 rows
已创建 1 行。
SQL> select * from t2;
COUNT
----------
1
SQL> insert into t1 values (-1);
insert into t1 values (-1)
*
ERROR 位于第 1 行:
ORA-02290: 违反检查约束条件 (HUJINPEI.SYS_C001573)
SQL> select * from t2;
COUNT
----------
1
为什么不是2?因为原子性的问题
实际上数据库悄悄的在每个数据库调用外面包了一个SAVEPOINT,前面的两个insert实际上就是做下面的处理的:
savepoint stat1
insert into t1 value(1);
if error then rollback to stat1;
savepoint stat2
insert into t1 values(-1);
if error then rollback to stat2;
2. 过程级的原则性
--------------------------
SQL> select * from t2;
COUNT
----------
0
SQL> select * from t1;
未选定行
SQL> create or replace procedure p
2 as
3 begin
4 insert into t1 values(1);
5 insert into t1 values(-1);
6 end;
7 /
过程已创建。
SQL> begin
2 p
3 ;
4 end;
5 /
Fired 1 rows
Fired 1 rows
Fired 1 rows
begin
*
ERROR 位于第 1 行:
ORA-02290: 违反检查约束条件 (HUJINPEI.SYS_C001573)
ORA-06512: 在"HUJINPEI.P", line 5
ORA-06512: 在line 2
SQL> select * from t1;
未选定行
SQL> select * from t2;
COUNT
----------
0
3.事务级的原则性
--------------------------
这个也就是我们经常遇到的common transactions.
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: