MySQL基礎07-事務

一、簡介

MySQL提供了兩種事務型的存儲引擎:InnoDB和NDB Cluster。另外還有一些第三方存儲引擎也支持事務,比較知名的包括XtraDB和PBXT。

事務的4大特性ACID。ACID表示原子性、一致性、隔離性和持久性。一個很好的事務處理系統,必須具備這些標準特性。

二、事務的ACID特性

1、原子性(Atomicity)
一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾。

2、一致性(consistency)
數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(其實原子性和隔離性間接的保證了一致性)

3、隔離性(isolation)
通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。後面我們討論隔離級別(Isolation level)的時候,會發現爲什麼我們要說“通常來說”是不可見的。

4、持久性(durability)
一旦事務提交,則其所做的修改就會永久保存到數據庫中。

三、隔離級別

而我們最常說的隔離性其實有對應的隔離級別,MySQL規定的隔離級別有4種,分別是:

1、READ UNCOMMITTED(讀未提交)
在此級別裏,事務的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,也就是會產生髒讀(Dirty Read),在實際應用中一般很少使用。

2、READ COMMITTED(讀已提交)
大多數數據庫系統的默認隔離級別都是它(但是MySQL不是),它能夠避免髒讀問題。這個級別有時候也叫做不可重複讀(nonrepeatable read),因爲再次執行相同的查詢,可能會得到不一樣的結果。

3、REPEATABLE READ(可重複讀)
該隔離級別是MySQL默認的隔離級別,該級別保證了在同一個事務中多次讀取同樣記錄的結果是一致。但是理論上,可重複讀隔離級別還是無法解決另外一個幻讀(Phantom Read)的問題。(注:這裏說的無法解決是MySQL定義層面,對於InnoDB引擎則完美的解決了幻讀的問題,如果你正在使用InnoDB引擎,可忽略)

4、SERIALIZABLE(可串行化)
該隔離級別是級別最高的,它通過鎖來強制事務串行執行,避免了前面說的所有問題。在高併發下,可能導致大量的超時和鎖爭用問題。實際應用中也很少用到這個隔離級別,因爲RR級別解決了所有問題。

注:執行select @@global.tx_isolation,可以確定數據庫的隔離級別。

MySQL可以通過執行SET TRANSACTION ISOLATION LEVEL命令來設置隔離級別。新的隔離級別會在下一個事務開始的時候生效。可以在配置文件中設置整個數據庫的隔離級別,也可以只改變當前會話的隔離級別:mysql > SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

參考

1、《高性能MySQL》 [美]Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko 著
2、 蹲廁所的熊談談MySQL-InnoDB存儲引擎事務的ACID特性
備用地址:https://view.inews.qq.com/a/20180427G1I97X00

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