1. 程式人生 > >資料庫事務的四大特性和事務的隔離級別

資料庫事務的四大特性和事務的隔離級別

事務的四大特性:

(1)原子性

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。

(2)一致性

一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態。

(3)隔離性

隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。每個事務都感覺不到有其他事務在併發地執行。

(4)永續性

永續性是指一個事務一旦被提交了,那麼對資料庫中的資料的改變是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

不考慮事務隔離性會出線的問題:

(1)、髒讀

髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這次一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。

(2)、不可重複讀

對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔內,另一個事務訪問這個資料,並進行了修改。

不可重複讀和髒讀的區別是:不可重複讀是訪問了前一資料提交了的資料,髒讀時讀取了另一個數據未提交的資料。

(3)、幻讀

如果一個事務修改一個數據庫中的所有行,此時另一個事務插入一個數據行,此時第一個事務再檢視剛剛修改的行的時候,發現還有一行沒修改,放佛發生了幻覺。

四種隔離級別:

① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

③ Read committed (讀已提交):可避免髒讀的發生。

④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀),而在Oracle資料庫中,只支援Serializable (序列化)級別和Read committed (讀已提交)這兩種級別,其中預設的為Read committed級別。