MySQL ACID及四種隔離等級的解釋

來源:互聯網
上載者:User

標籤:io   ar   使用   sp   strong   資料   on   art   問題   

以下內容出自《高效能MySQL》第三版,瞭解事務的ACID及四種隔離級有助於我們更好的理解事務運作。

下面舉一個銀行應用是解釋事務必要性的一個經典例子。假如一個銀行的資料庫有兩張表:支票表(checking)和儲蓄表(savings)。現在要從使用者Jane的支票賬戶轉移200美元到她的儲蓄賬戶,那麼至少需要三個步驟:

1、檢查支票賬戶的餘額高於或者等於200美元。

2、從支票賬戶餘額中減去200美元。

3、在儲蓄帳戶餘額中增加200美元。

上述三個步驟的操作必須打包在一個事務中,任何一個步驟失敗,則必須復原所有的步驟。

 

可以用START TRANSACTION語句開始一個事務,然後要麼使用COMMIT提交將修改的資料持久儲存,要麼使用ROLLBACK撤銷所有的修改。事務SQL的樣本如下:

1. start transaction;

2. select balance from checking where customer_id = 10233276;

3. update checking set balance = balance - 200.00 where customer_id = 10233276;

4. update savings set balance = balance + 200.00 where customer_id = 10233276;

5. commit;

 

ACID表示原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。一個很好的交易處理系統,必須具備這些標準特性:

 

原子性(atomicity)

  一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗復原,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性

一致性(consistency)

     資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有提交,所以事務中所做的修改也不會儲存到資料庫中。)

隔離性(isolation)

     通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶匯總程式開始運行,則其看到支票帳戶的餘額並沒有被減去200美元。)

持久性(durability)

  一旦事務提交,則其所做的修改不會永久儲存到資料庫。(此時即使系統崩潰,修改的資料也不會丟失。持久性是個有占模糊的概念,因為實際上持久性也分很多不同的層級。有些持久性策略能夠提供非常強的安全保障,而有些則未必,而且不可能有能做到100%的持久性保證的策略。)

 

隔離等級:

READ UNCOMMITTED(未提交讀)

  在READ UNCOMMITTED層級,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(Dirty Read)。這個層級會導致很多問題,從效能上來說,READ UNCOMMITTED不會比其他的層級好太多,但卻缺乏其他層級的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。

READ COMMITTED(提交讀)

  大多數資料庫系統的預設隔離等級都是READ COMMTTED(但MySQL不是)。READ COMMITTED滿足前面提到的隔離性的簡單定義:一個事務開始時,只能"看見"已經提交的事務所做的修改。換句話說,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個層級有時候叫做不可重複讀取(nonrepeatble read),因為兩次執行同樣的查詢,可能會得到不一樣的結果

REPEATABLE READ(可重複讀)

  REPEATABLE READ解決了髒讀的問題。該隔離等級保證了在同一個事務中多次讀取同樣記錄結果是一致的。但是理論上,可重複讀隔離等級還是無法解決另外一個幻讀(Phantom Read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另一個事務又在該範圍插入入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(Phantom Row)。InnoDB和XtraDB儲存引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。

SERIALIZABLE(可序列化)

  SERIALIZABLE是最高的隔離等級。它通過強制事務串列執行,避免了前面說的幻讀的問題。簡單來說,SERIALIZABLE會在讀取每一行資料都加鎖,所以可能導致大量的逾時和鎖爭用問題。實際應用中也很少用到這個隔離等級,只有在非常需要確保資料的一致性而且可以接受沒有並發的情況下,才考慮採用該層級。

 

MySQL ACID及四種隔離等級的解釋

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.