oracle数据库原子性,Oracle 事务原子性的实验

以下均为实验结果很清楚,不做过多说明了:)

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> conn

已连接。

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值