Oracle 事務原子性的實驗

oracle_ace發表於2007-12-26

以下均為實驗結果很清楚,不做過多說明了:)

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 hujinpei/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.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-6474/,如需轉載,請註明出處,否則將追究法律責任。

相關文章