數據庫中的事務

 1.事務概念

事務是由一步或者幾步數據庫操作序列組成的邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。

通俗的說的話,事務就是一件事情,要麼成功執行到底,要麼回到起點,什麼都不做。

事物的特性(ACID)

原子性(Atomicity):正如原子時自然界最小顆粒,具有不可再分的特徵一樣。意思就是說,咱的事務是一個邏輯單元,不能再拆分了,比如整體的執行。

一致性(Consistency):事務執行的結果,必須使數據庫從一個一致性狀態,變到另一個一致性狀態。比如說銀行之間的轉賬,從A賬戶向B賬戶轉入1000元。系統先減少A賬戶1000元,然後再爲B賬戶增加1000元。如果全部執行成功的話,則數據庫就處於一致性狀態。如果僅僅A賬戶金額修改,B賬戶沒有增加的話,那麼數據庫就處於不一致的狀態。因此,一致性必須通過原子性來保證。

隔離型(Isolation):各個事務執行互不干擾,任意一個事務的內部操作對其他併發的事務都是隔離的。也就是說,併發執行的事務之間不能看到對方的中間狀態。併發事務之間是不能互相影響的。

持久性(Durability):事務一旦提交,對數據所做的改變都要記錄到存儲器中,通常就是保存進物理數據庫。


 2.隔離性帶來的併發問題

由於各個事務之間可能出現併發訪問的問題,因此隔離性將會帶來髒讀、不可重複讀、虛度、丟失更新的問題。

髒讀:一個事務讀取了另一個事務未提交的數據。

例如,小明去銀行取錢,她老婆呢此時正在通過支付寶轉賬。她老婆查出來的錢爲2000,於是,轉走1000,但是還沒有提交事務,小明此時過來查出來的錢爲2000,於是這2000就爲髒數據。整個過程中,她老婆的事務過程包裹這小明的事務過程,但是並未執行完全,因此導致了髒數據的產生。

不可重複讀:一個事務中連續讀取兩次,第二次讀取另一個事務已經提交Update修改的數據(數據改變),兩次讀取到的數據不一致。

還是緊接着上述的例子,小明首先查出來的錢爲2000,此時她老婆轉走1000,並且她老婆的事務提交,完成。當小明取完錢後,再看了一下自己的賬戶餘額,發現爲何不是1000,而是0呢?因此兩次讀取的數據不一致。導致了不可重複讀的產生。

幻讀:一個事務讀取另一個事務已經提交插入的數據(Insert),因此記錄條數已經改變。

比如有一張學生信息的表,統計這全班男女的學生信息,此時我正在通過SQL語句,查詢男學生的個數,有一個同學向庫裏面又插入了一條男同學的信息,當我第二次再次查詢的時候,多出一條,導致了幻讀的產生(Insert)


 3.數據庫的隔離級別

爲了解決上面隔離性帶來的問題,於是出現了隔離級別的概念,首先不是所有數據庫都支持這四種級別,

1.Read_Uncommited:讀取未提交,引發所有隔離問題。上面四個問題並未解決。

2.Read_Committed:讀已提交,防止了髒數據的產生,但是會產生不可重複讀和幻讀。

3.Repeatable_Read:重複讀,阻止髒讀,不可重複讀,發生幻讀的問題。

4.Serializable:串行處理,不允許兩個事務,同時操作一個目標數據,根本不存在併發問題。因此效率和性能低下。


企業開發過程中,主要是Read_Committed(Oracle默認級別)、Repeatable_Read(MySQL默認級別)


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