事務的動作要麼一起成功,要麼都不成功,這是事務的原子性。
原子性包括:
語句級原子性
過程級原子性
事務級原子性
ddl與原子性
如果某條語句(如insert、update)執行成功與否會自動控制事務。
如設定插入前的觸發器。
create
table t2(cnt int);
insert
into t2 values(0
);commit
;create
table t(x int
check
(x>0)
);create
trigger t_tragger
before insert
orupdate
on t for each row
begin
if(inserting)
then
update t2 set cnt=cnt+1;
else
update t2 set cnt=cnt-1;
endif
; dbms_output.put_line(
'i fired and updateed '
||sql
%rowcount
||'rows');
end;
由於 表t設定了值約束,當插入負數的時候,是不能插入的
insert
into t values(1
);
此時 表t2中的cnt=1
如果
insert into t values(-1);
會報ora-02290違反檢查約束條件
此時去檢查表t2的cnt值沒有更新成2,仍然是1.
書《oracle程式設計藝術》中sqlserver需要顯式執行觸發器的回滾才能實現觸發器的不執行,但是我測試的是可以的。
create
table t1 (cnt int
)create
table t (v int
check
(v>0)
)create
trigger t_tragger
on t
forinsert
asbegin
update t1 set cnt=cnt+1;
endinsert
into t1 values(0
)select
*from t1
insert
into t values(-
1)
測試在儲存過程中往表t中插入負數,會不會觸發觸發器的更新操作
create
orreplace
procedure p
asbegin
insert
into t values(1
);insert
into t values(-
1);end
;
當執行
begin
p;end;
會報ora02290錯誤
表t 、t2不會插入和更新任何值
如果加入異常判斷
begin
p;exception
when others then
dbms_output.put_line(
'error'
|| sqlerrm)
;end
;
在when others then中
沒有對錯誤丟擲處理,只是進行了列印,
那麼再執行時不會報錯。
此時查詢表t/t2會發現值被更新了一次。
這是因為儲存過程中的每個insert語句進行了事務提交,第二句sql因為不滿足約束資訊,跳轉到when others then卻沒有執行異常處理,就回滾了。但是第一句sql沒有回滾,被提交了。
begin
p;exception
when others then
--dbms_output.put_line('error'|| sqlerrm);
-20001
,sqlerrm)
;end
;
一組sql語句作為乙個工作單元一同執行。資料庫從一種一致狀態轉變為另一種一致狀態。
在oralce中執行ddl操作會導致事務的自動提交
尤其注意的是truncate table會導致事務提交。
但在sqlserver中可以在事務中建立臨時表,不會導致事務提交。
理解事務 原子性 一致性 隔離性
事務是指對系統進行的一組操作,為了保證系統的完整性,事務需要具有acid特性,具體如下 1.原子性 atomic 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾實際上是乙個比較高層抽象的概念,大多數db在...
事務一致性與原子性的區別
其實一致性和原子性在事務裡是兩個不太相關,但又很相關的邏輯來的 一致性 這個講的是事務是按照預期生效的,也就是你舉例的那個轉賬的,一致性的核心一部分是靠原子性實現的,而另一部分是邏輯實現。舉個例子吧 轉賬 張三給李四轉賬100元。那資料庫假設需要 張三扣100,李四加100,記錄一條流水。如果流水沒...
事務的原子性,一致性,隔離性,永續性
事務的原子性 事務的原子性指的是,事務中包含的程式作為資料庫的邏輯工作單位,它所做的對資料改操作要全部執行,要麼全部不執行。這種特性稱為原子性。事務的原子性要求,如果把乙個事務看作是乙個程式,它要麼完整的被執行,要麼完全執行。就是說事務的操縱序列或者完全應用到資料庫或者完全不影響資料庫。這種特性稱為...