1. 程式人生 > >Oracle資料一致性與事務管理

Oracle資料一致性與事務管理

資料一致性和事務

Oracle中的資料一致性

當從A表取一條資料新增到B表時,需先刪除A表資料,再新增B表資料,

如果第二條操作出異常時,就造成了資料不一致。

Oracle中的事務

事務是保證資料一致性的重要手段,試圖改變資料庫狀態的多個動作應該視作一個密不可分的整體。無論其中經過了多麼複雜的操作,該整體執行之前和執行之後,資料庫均保證一致性。整個邏輯整體即是一個事務。

Oracle中的事務處理

事務的生命週期包括:事務開始、事務執行和事務結束。Oracle中,不會顯式宣告事務開始,而是由Oracle自行處理,事務結束可以利用commit或者rollback命令

利用commit命令界定事務

在一個會話中,一次事務的結束便意味著新事務的開始。事務的結束可以用commit命令

Update...;
Update...;
Update...;

利用多次Update命令,任意2個步驟間不存在commit和rollback命令,因此他們處於同一事務中。可以利用commit命令來提交修改

事務是指全部提交或者全部回滾,並不代表所有動作都可成功執行,如果某個動作失敗,利用commit仍會提交所有成功的修改。

begin
	Update...;
	Update...;
	Update...;
	commit;
end

當使用begin end塊時,一旦sql語句出現錯誤,那麼不會對資料庫做任何修改。

利用rollback命令界定事務

rollback回滾事務內的所有資料修改,並結束事務。

Update...;
Update...;
Update...;
rollback;

資料仍保持原狀

Oracle事務的屬性和隔離級別

Read only屬性

利用Read only 設定只讀事務
set transaction Read only ;

一旦設定事務為只讀事務,則不能進行任何資料庫修改操作、

只讀事務除了自身不能修改資料庫之外,還凍結了自身所認識到的資料庫狀態。也就是說,即使有其他事務修改了資料庫狀態,只讀事務是無法識別的。

rollback回滾事務可以解除只讀事務。

只讀事務的特性,可以提供一種穩定的狀態,從而處理大量的資料查詢工作。例如,在生成統計報表時,需要查詢大量資料。大資料量的查詢耗時較多,又需要遮蔽外界干擾。在處理報表的過程中,可以利用只讀事務提供穩定的環境,以使生成的報表更符合實際情況。

Read write 屬性

Read write屬性可以將事務設定為可讀、可寫狀態。也是事務的預設狀態。此狀態下,事務可以查詢、更新資料庫內容。

serializable隔離級別

隔離級別是指當前事務對資料庫狀態變化的遮蔽程度。具有serializable隔離級別的事務是序列化事務。此事務與只讀事務有完全相同的隔離級別,對外界其他事務對資料庫的修改沒有認知度。

設定隔離界別為serializable
set transaction isolation level serializable

與只讀事務不同,序列化事務中是可以對資料庫進行修改操作的。

Read commited隔離級別

Read commited隔離級別是事務的預設隔離級別。具有該隔離級別的事務只能識別其他事務已經提交的資料修改。

事務處理原則

原子性

原子性是事務的最基本屬性。整個事務所有操作是一個邏輯整體。如同院子一樣,不可分割,或者全部執行,或者都不執行。

一致性

事務結束後(無論提交還是回滾),資料庫中資料的狀態必須保持一致性、

隔離性

多個事務可能同時執行。在執行過程中,這些事務之間必須保持互相獨立,不能相互影響。

髒讀取

一個事務在執行時,有可能讀取到外界其他事物對資料庫的修改,這些修改是尚未提交,並可能被回滾。如果當前事務受到外界未提交資料的影響,將造成髒讀取。

不可重讀

同一事務中,前後2次讀取表中同一記錄,結果不同的。是因為有外界事務修改了該資料。這種修改是其他事務結束之後對資料的影響。

影像讀取

同一事務中,前後2次執行相同的查詢。第一次結果仍存在第二次結果中,並且沒有任何改變。

在這裡插入圖片描述

永續性

永續性是指,事務一旦提交,對資料庫的修改記錄到永久介質中,例如存為磁碟檔案,及時下一刻資料庫故障,資料也不會丟失。

當用戶提交事務時,Oracle總是先生成redo檔案。此檔案記錄了事務對資料庫修改的細節,即使系統崩潰,Oracle同樣可以利用redo檔案保證所有事務成功提交。