什麼是ACID

 ACID是關係型數據庫的基石.

ACID,指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。

  原子性

  整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  一致性

  在事務開始之前和事務結束以後,數據庫的完整性約束沒有被破壞。

  隔離性

  兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。

  持久性

  在事務完成以後,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。

  由於一項操作通常會包含許多子操作,而這些子操作可能會因爲硬件的損壞或其他因素產生問題,要正確實現ACID並不容易。ACID建議數據庫將所有需要更新 以及修改的資料一次操作完畢,但實際上並不可行。

  目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日誌式的方式。第二種是Shadow paging。

事務隔離級別:一個事務對數據庫的修改與並行的另一個事務的隔離程度。

兩個併發事務同時訪問數據庫表相同的行時,可能存在以下三個問題:

1、幻想讀:事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻想。

2、不可重複讀取:事務T1讀取一行記錄,緊接着事務T2修改了T1剛剛讀取的記錄,然後T1再次查詢,發現與第一次讀取的記錄不同,這稱爲不可重複讀。

3、髒讀:事務T1更新了一行記錄,還未提交所做的修改,這個T2讀取了更新後的數據,然後T1執行回滾操作,取消剛纔的修改,所以T2所讀取的行就無效,也就是髒數據。

爲了處理這些問題,SQL標準定義了以下幾種事務隔離級別:

Oracle數據庫支持READ COMMITTED 和 SERIALIZABLE這兩種事務隔離級別。Oracle不支持髒讀。

SQL標準所定義的默認事務隔離級別是SERIALIZABLE,但是Oracle 默認使用的是READ COMMITTED 設置隔離級別使用

 SET TRANSACTION ISOLATION LEVEL

 [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章