一、簡介
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
可以解決髒讀、不可重複讀、幻讀,性能最差