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檔案保證所有事務成功提交。