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 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 併發程式設計的原子性 != 事務ACID的原子性程式設計
- 不支援原子性的 Redis 事務也叫事務嗎?Redis
- 面試官:Redis的事務滿足原子性嗎?面試Redis
- oracle實驗記錄 (事務控制)Oracle
- 資料庫事務,原子性、一致性、隔離性、永續性資料庫
- 深入理解oracle的事務隔離性Oracle
- 事務的屬性
- mongodb 的事務性操作MongoDB
- MySQL事務(二)事務隔離的實現原理:一致性讀MySql
- oracle 中的事務Oracle
- oracle 事務Oracle
- oracle事務Oracle
- 用友微服務事務一致性實踐微服務
- Redis 中的原子操作(1)-Redis 中命令的原子性Redis
- MySQL資料庫事務隔離性的實現MySql資料庫
- oracle的只讀事務Oracle
- Oracle的事務和鎖Oracle
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- Golang 實現 Redis(10): 本地原子性事務GolangRedis
- oracle中同一事務內的一致性讀Oracle
- ORACLE 死事務的回滾Oracle
- 【實驗】Oracle的serializable隔離性級別影響Oracle
- Spring事務的傳播屬性Spring
- Dubbo 分散式事務一致性實現分散式
- Oracle只讀事務Oracle
- ORACLE事務管理概述Oracle
- oracle分散式事務Oracle分散式
- 使用 Debezium 實現真正的原子微服務以確保資料一致性 – brainDOSE微服務AI
- 關於IOS 屬性atomic(原子性)的理解iOS
- 一文搞懂MySQL事務的隔離性如何實現|MVCCMySqlMVC
- 請教:事務的完整性一般怎麼實現?
- 淺談ORACLE的分散式事務Oracle分散式
- oracle檢視回滾的事務Oracle
- oracle事務中的儲存點Oracle
- 事務可見性的判斷和事務隔離級別,PostgreSQL和MySQL實現上有啥區別MySql
- Redis 中的事務分析,Redis 中的事務可以滿足ACID屬性嗎?Redis
- 知其所以然~redis的原子性Redis
- MySQL innodb 事務的實現MySql