MySQL的ACID以及事務的隔離級別

一、簡介

MySQL中的事務是恢復和併發的控制基本單位,因此,如何使用事務以及選擇事務的隔離級別,對於mysql十分重要

二、事務的特徵ACID

事務有如下四個特徵,分別爲原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability),簡稱ACID

1、原子性

原子性指的是一個事務,要麼全部執行成功,要麼全部不執行,像一個原子一個不可分割。如轉賬操作,A轉給B金額100,首先A的餘額-100,然後B的餘額+100。轉賬操作要麼都完成,要麼都不完成。

2、一致性

一致性指的是一個事務,在事務開始執行前的狀態,和事務結束之後的狀態,是一致的。比如轉賬操作,事務開始前,A和B的餘額假設總和是1000,那麼A轉給B金額100後,A和B的餘額總和仍然是1000。

3、隔離性

隔離性指的是多個事務在執行過程中,是相互隔離的,互不影響。其中,事務的隔離級別在mysql中共有四種

4、持久性

持久性指的是事務提交完成之後,數據庫對數據的保存是永久的,不會因爲服務器宕機而導致數據丟失。如JDBC向數據庫提交數據後,數據在數據庫中必須永久保存。

三、事務出現的問題

事務是併發控制的基本單位,因此多個事務並行執行會導致一定的問題,可能產生的問題如下:

1、髒讀

髒讀指的是一個事務,讀取了另一個事務中未提交的數據。那麼,當另外的事務由於錯誤而回滾時,將導致第一個事務讀取錯誤。

2、不可重複讀

不可重複讀指的是,一個事務中,兩次讀取同一個內容,但是讀取到的數據卻不相同。導致的原因是第二次的數據,被另一個事務修改並提交了事務。

3、幻讀

幻讀出現在一個非獨立事務時,將可能導致發生。比如一個事務的有兩個操作,第一是將所有的賬戶餘額全部初始化爲0,第二步是查詢修改後的結果。但是第二步修改查詢修改後的結果時,卻發現有一條數據賬戶餘額是100.導致的原因是,另一個事務插入了一條賬戶餘額爲100的數據,並提交了事務。因此將導致幻讀現象。

四、事務的隔離級別

mysql中提供了四種事務的隔離級別,隔離級別越高,可以處理以上的問題越多,但性能越差

1、讀未提交read uncommitted

可能導致的問題是髒讀、不可重複讀、幻讀

2、讀已提交read committed

可能導致的問題是不可重複讀、幻讀,可以解決髒讀現象。

3、可重複讀repeatable read(MySQL的默認隔離級別)

可能導致的問題是幻讀,可以解決不可重複度、髒讀現象。

4、串行化serializable

可以解決髒讀、不可重複讀、幻讀,性能最差

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